web-dev-qa-db-de.com

Ermitteln Sie die Anzahl der Zeilen mit dplyr/group_by

Ich verwende das mtcars-Dataset. Ich möchte die Anzahl der Datensätze für eine bestimmte Datenkombination ermitteln. Etwas, das der Klausel count(*) group by in SQL sehr ähnlich ist. ddply() von plyr arbeitet für mich 

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

hat Ausgabe

  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

Verwenden Sie diesen Code

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

hat Ausgabe

  length(cyl)
1          32

Ich habe verschiedene Funktionen gefunden, die an summarise() übergeben werden können, aber scheinbar keine für mich funktionieren. Eine Funktion, die ich gefunden habe, ist sum(G), die zurückgegeben wurde

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

Versuchte mit n(), die zurückkehrte 

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

Was mache ich falsch? Wie kann ich group_by()/summarise() für mich arbeiten lassen?

55
charmee

Es gibt eine spezielle Funktion n() in dplyr, um Zeilen zu zählen (möglicherweise innerhalb von Gruppen):

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

Dplyr bietet aber auch eine praktische count-Funktion, die mit weniger Tippen genau das gleiche tut:

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

ein anderer Ansatz ist die Verwendung der Doppelpunkte:

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

Eine andere Option, die nicht unbedingt eleganter ist, jedoch nicht auf eine bestimmte Spalte verweisen muss:

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

Ich denke, was Sie suchen, ist wie folgt. 

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

Dies verwendet das dplyr-Paket. Dies ist im Wesentlichen die Langversion der count () - Lösung von docendo discimus. 

0
tb.