varias superponer studio lineas histogramas graficos graficas r dataframe r-faq

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)