Contar el número de filas por grupo usando dplyr

81

Estoy usando el mtcarsconjunto de datos. Quiero encontrar el número de registros para una combinación particular de datos. Algo muy parecido a la count(*)cláusula group by en SQL. ddply()de plyr está funcionando para mí

library(plyr)
ddply(mtcars, .(cyl,gear),nrow)

tiene salida

  cyl gear V1
1   4    3  1
2   4    4  8
3   4    5  2
4   6    3  2
5   6    4  4
6   6    5  1
7   8    3 12
8   8    5  2

Usando este código

library(dplyr)
g <- group_by(mtcars, cyl, gear)
summarise(g, length(gear))

tiene salida

  length(cyl)
1          32

Encontré varias funciones para pasar, summarise()pero ninguna parece funcionar para mí. Una función que encontré es sum(G), que devolvió

Error in eval(expr, envir, enclos) : object 'G' not found

Intenté usar n(), que volvió

Error in n() : This function should not be called directly

¿Qué estoy haciendo mal? ¿Cómo puedo conseguir group_by()/ summarise()trabajar para mí?

charmee
fuente
No puedo reproducir esto. Obtengo el mismo resultado que de ddply. ¿En qué versión de dplyr estás? ¿Intenta actualizar?
joran
Tengo la última versión 0.1.3. ¿Tiene 0.1.2?
charmee
¡No! Tu ejemplo me funciona bien con 0.1.3.
joran
1
¿Qué versión de R tienes? ¿Podría eso estar causando la diferencia en el comportamiento? También probé esto en una computadora en casa que usa Ubuntu, lo mismo ..
charmee
2
¡¡¡Gracias!!! Eso lo resolvió. Si tengo los paquetes plyr y dplyr adjuntos, el resumen no funciona como se esperaba. Tan pronto como reinicié la sesión (y no adjunté todos los paquetes normales de forma predeterminada) pude hacer que funcionara. Uf.
charmee

Respuestas:

123

Hay una función especial n()en dplyr para contar filas (potencialmente dentro de grupos):

library(dplyr)
mtcars %>% 
  group_by(cyl, gear) %>% 
  summarise(n = n())
#Source: local data frame [8 x 3]
#Groups: cyl [?]
#
#    cyl  gear     n
#  (dbl) (dbl) (int)
#1     4     3     1
#2     4     4     8
#3     4     5     2
#4     6     3     2
#5     6     4     4
#6     6     5     1
#7     8     3    12
#8     8     5     2

Pero dplyr también ofrece una práctica countfunción que hace exactamente lo mismo con menos escritura:

count(mtcars, cyl, gear)          # or mtcars %>% count(cyl, gear)
#Source: local data frame [8 x 3]
#Groups: cyl [?]
#
#    cyl  gear     n
#  (dbl) (dbl) (int)
#1     4     3     1
#2     4     4     8
#3     4     5     2
#4     6     3     2
#5     6     4     4
#6     6     5     1
#7     8     3    12
#8     8     5     2
talat
fuente
16

otro enfoque es usar dos puntos dobles:

mtcars %>% 
  dplyr::group_by(cyl, gear) %>%
  dplyr::summarise(length(gear))
usuario3026255
fuente
9

Creo que lo que buscas es lo siguiente.

cars_by_cylinders_gears <- mtcars %>%
  group_by(cyl, gear) %>%
  summarise(count = n())

Esto está usando el paquete dplyr. Esta es esencialmente la versión de mano de la solución count () proporcionada por docendo discimus.

tuberculosis.
fuente
Funciona para mi. La parte crucial NO es especificar las comillas alrededor de los nombres de las columnas para agrupar.
ivan866
3

Otra opción, no necesariamente más elegante, pero que no requiere hacer referencia a una columna específica:

mtcars %>% 
  group_by(cyl, gear) %>%
  do(data.frame(nrow=nrow(.)))
Matifou
fuente
1
eso solo le da la información nrowdel conjunto de datos, no del grupo
Hack-R