studio - superponer graficas en r
Contar el nĂºmero de filas dentro de cada grupo (11)
Tengo un marco de datos y me gustaría contar el número de filas dentro de cada grupo. Regularmente uso la función aggregate
para sumar los datos de la siguiente manera:
df2 <- aggregate(x ~ Year + Month, data = df1, sum)
Ahora, me gustaría contar las observaciones pero no puedo encontrar el argumento adecuado para la FUN
. Intuitivamente, pensé que sería lo siguiente:
df2 <- aggregate(x ~ Year + Month, data = df1, count)
Pero, no tal suerte.
¿Algunas ideas?
Algunos datos de juguetes:
set.seed(2)
df1 <- data.frame(x = 1:20,
Year = sample(2012:2014, 20, replace = TRUE),
Month = sample(month.abb[1:3], 20, replace = TRUE))
Cree una nueva variable Count
con un valor de 1 para cada fila:
df1["Count"] <-1
Luego agregue la dataframe, sumando por la columna Count
:
df2 <- aggregate(df1[c("Count")], by=list(year=df1$year, month=df1$month), FUN=sum, na.rm=TRUE)
La opción simple de usar con aggregate
es la función de length
que le dará la longitud del vector en el subconjunto. Algunas veces, un poco más robusto es usar la function(x) sum( !is.na(x) )
.
Para mis agregaciones, suelo terminar queriendo ver el significado y "qué tan grande es este grupo" (también conocido como longitud). Así que este es mi fragmento útil para esas ocasiones;
agg.mean <- aggregate(columnToMean ~ columnToAggregateOn1*columnToAggregateOn2, yourDataFrame, FUN="mean")
agg.count <- aggregate(columnToMean ~ columnToAggregateOn1*columnToAggregateOn2, yourDataFrame, FUN="length")
aggcount <- agg.count$columnToMean
agg <- cbind(aggcount, agg.mean)
Siguiendo la sugerencia de @Joshua, aquí hay una manera en que puede contar el número de observaciones en su marco de datos df
donde Year
= 2007 y Month
= Noviembre (suponiendo que sean columnas):
nrow(df[,df$YEAR == 2007 & df$Month == "Nov"])
y con aggregate
, siguiendo a @GregSnow:
aggregate(x ~ Year + Month, data = df, FUN = length)
También hay df2 <- count(x, c(''Year'',''Month''))
(paquete plyr)
También podemos usar dplyr
.
Primero, algunos datos:
df <- data.frame(x = rep(1:6, rep(c(1, 2, 3), 2)), year = 1993:2004, month = c(1, 1:11))
Ahora el conteo:
library(dplyr)
count(df, year, month)
#piping
df %>% count(year, month)
También podemos usar una versión ligeramente más larga con tuberías y la función n()
:
df %>%
group_by(year, month) %>%
summarise(number = n())
o la función `tally:
df %>%
group_by(year, month) %>%
tally()
Teniendo en cuenta la respuesta de @Ben, R arrojaría un error si df1
no contiene la columna x
. Pero se puede resolver elegantemente con paste
:
aggregate(paste(Year, Month) ~ Year + Month, data = df1, FUN = NROW)
Del mismo modo, se puede generalizar si se usan más de dos variables en la agrupación:
aggregate(paste(Year, Month, Day) ~ Year + Month + Day, data = df1, FUN = NROW)
Una alternativa a la función aggregate()
en este caso sería table()
con as.data.frame()
, que también indicaría qué combinaciones de Year y Month están asociadas con cero ocurrencias.
df<-data.frame(x=rep(1:6,rep(c(1,2,3),2)),year=1993:2004,month=c(1,1:11))
myAns<-as.data.frame(table(df[,c("year","month")]))
Y sin las combinaciones de cero ocurrencia
myAns[which(myAns$Freq>0),]
Una solución sql que usa el paquete sqldf
:
library(sqldf)
sqldf("SELECT Year, Month, COUNT(*) as Freq
FROM df1
GROUP BY Year, Month")
Una vieja pregunta sin una solución data.table
. Así que aquí va ...
Usando .N
library(data.table)
DT <- data.table(df)
DT[, .N, by = list(year, month)]
lw<- function(x){length(which(df$variable==someValue))}
agg<- aggregate(Var1~Var2+Var3, data=df, FUN=lw)
names(agg)<- c("Some", "Pretty", "Names", "Here")
View(agg)