web-dev-qa-db-fra.com

Rechercher le nombre de lignes à l'aide de dplyr/group_by

J'utilise l'ensemble de données mtcars. Je veux trouver le nombre d'enregistrements pour une combinaison particulière de données. Quelque chose de très similaire à la clause count(*) group by dans SQL. ddply() de plyr travaille pour moi 

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

a sortie

  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

Utiliser ce code

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

a sortie

  length(cyl)
1          32

J'ai trouvé diverses fonctions à transmettre à summarise() mais aucune ne semble fonctionner pour moi. Une fonction que j'ai trouvée est sum(G), qui est retournée

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

Essayé en utilisant n(), qui est retourné 

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

Qu'est-ce que je fais mal? Comment puis-je faire fonctionner group_by()/summarise() pour moi?

55
charmee

Il y a une fonction spéciale n() dans dplyr pour compter les lignes (potentiellement au sein de groupes):

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

Mais dplyr propose également une fonction pratique count qui fait exactement la même chose avec moins de frappe:

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
94
docendo discimus

une autre approche consiste à utiliser les doubles points:

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

Une autre option, pas nécessairement plus élégante, mais ne nécessite pas de se référer à une colonne spécifique:

mtcars %>% 
  group_by(cyl, gear) %>%
  do(data.frame(nrow=nrow(.)))
3
Matifou

Je pense que ce que vous recherchez est comme suit. 

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

Ceci utilise le paquet dplyr. Il s'agit essentiellement de la version longue de la solution count () fournie par docendo discimus. 

0
tb.