Tengo un marco de datos y me gustaría contar el número de filas dentro de cada grupo. Normalmente utilizo la aggregate
función para sumar datos de la siguiente manera:
df2 <- aggregate(x ~ Year + Month, data = df1, sum)
Ahora, me gustaría contar las observaciones, pero parece que no puedo encontrar el argumento adecuado para FUN
. Intuitivamente, pensé que sería lo siguiente:
df2 <- aggregate(x ~ Year + Month, data = df1, count)
Pero no tuve tanta 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))
nrow
,NROW
,length
...nrow
no funcionó para mí, peroNROW
ylength
bien trabajado. +1Respuestas:
La mejor práctica actual (tidyverse) es:
fuente
cbind
los resultados deaggregate(Sepal.Length ~ Species, iris, mean)
yaggregate(Sepal.Length ~ Species, iris, length)
df %>% group_by(group, variable) %>% mutate(count = n())
Siguiendo la sugerencia de @ Joshua, aquí hay una forma en que puede contar el número de observaciones en su
df
marco de datos dondeYear
= 2007 yMonth
= Nov (asumiendo que son columnas):y con
aggregate
, siguiendo a @GregSnow:fuente
dplyr
paquete hace esto concount
/tally
comandos, o lan()
función :Primero, algunos datos:
Ahora el recuento:
También podemos utilizar una versión un poco más larga con ribete y la
n()
función:o la
tally
función:fuente
Una vieja pregunta sin
data.table
solución. Así que aquí va ...Utilizando
.N
fuente
.()
lugar delist()
ysetDT()
convertir un data.frame en data.table. Así que en un solo pasosetDT(df)[, .N, by = .(year, month)]
.La opción más simple para usar
aggregate
es lalength
función que le dará la longitud del vector en el subconjunto. A veces se utiliza un poco más robustofunction(x) sum( !is.na(x) )
.fuente
Cree una nueva variable
Count
con un valor de 1 para cada fila:Luego agregue el marco de datos, sumando por la
Count
columna:fuente
aggregate
, no es necesario cambiar el nombre de cada variable enby=
like,list(year=df1$year)
etc. Adata.frame
es unlist
ya, asíaggregate(df1[c("Count")], by=df1[c("Year", "Month")], FUN=sum, na.rm=TRUE)
que funcionará.Una alternativa a la
aggregate()
función en este caso seríatable()
conas.data.frame()
, que también indicaría qué combinaciones de Año y Mes están asociadas con cero ocurrencias.Y sin las combinaciones de ocurrencia cero
fuente
Si desea incluir 0 recuentos para meses-años que faltan en los datos, puede usar un poco de
table
magia.Por ejemplo, el toy data.frame de la pregunta, df1, no contiene observaciones de enero de 2014.
La
aggregate
función base R no devuelve una observación para enero de 2014.Si desea una observación de este mes-año con 0 como recuento, entonces el código anterior devolverá un data.frame con recuentos para todas las combinaciones mes-año:
fuente
Para mis agregaciones, generalmente termino queriendo ver la media y "qué tan grande es este grupo" (también conocido como longitud). Así que este es mi fragmento útil para esas ocasiones;
fuente
UNA sqlsolución usando el
sqldf
paquete:fuente
Teniendo en cuenta la respuesta de @Ben, R arrojaría un error si
df1
no contiene unax
columna. Pero se puede resolver elegantemente conpaste
:Del mismo modo, se puede generalizar si se utilizan más de dos variables en la agrupación:
fuente
Puede usar
by
funciones yaby(df1$Year, df1$Month, count)
que producirán una lista de agregación necesaria.La salida se verá así,
fuente
Ya hay muchas respuestas maravillosas aquí, pero quería agregar 1 opción más para aquellos que desean agregar una nueva columna al conjunto de datos original que contiene la cantidad de veces que se repite esa fila.
Lo mismo podría lograrse combinando cualquiera de las respuestas anteriores con la
merge()
función.fuente
Si está probando las soluciones agregadas anteriores y obtiene el error:
tipo no válido (lista) para variable
Debido a que está usando marcas de fecha o fecha y hora, intente usar as.character en las variables:
En una o ambas variables.
fuente