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í?


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

16

otro enfoque es usar dos puntos dobles:

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

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.


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(.)))

1
eso solo le da la información nrowdel conjunto de datos, no del grupo
Hack-R
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.