Zählen Sie die Anzahl der Zeilen nach Gruppe mit dplyr

81

Ich benutze den mtcarsDatensatz. Ich möchte die Anzahl der Datensätze für eine bestimmte Datenkombination ermitteln. Etwas sehr Ähnliches wie die count(*)Group by-Klausel in SQL. 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

Mit diesem Code

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

hat Ausgabe

  length(cyl)
1          32

Ich habe verschiedene Funktionen gefunden, an die ich weitergeben kann, summarise()aber keine scheint für mich zu funktionieren. Eine Funktion, die ich gefunden habe, ist die sum(G), die zurückgegeben wurde

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

Versucht mit n(), die zurückgegeben

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

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

charmee
quelle
Ich kann das nicht reproduzieren. Ich bekomme die gleiche Ausgabe wie von ddply. Auf welcher Version von dplyr bist du? Versuchen Sie zu aktualisieren?
Joran
Ich habe die neueste Version 0.1.3. Hast du 0.1.2?
Charmee
Nee. Ihr Beispiel funktioniert für mich mit 0.1.3 einwandfrei.
Joran
1
Welche Version von R hast du? Könnte das den Unterschied im Verhalten verursachen? Ich habe dies auch auf einem Computer zu Hause versucht, der Ubuntu verwendet, dasselbe ..
charmee
2
Vielen Dank!!! Das hat es gelöst. Wenn ich sowohl Plyr- als auch Dplyr-Pakete angehängt habe, funktioniert die Zusammenfassung nicht wie erwartet. Sobald ich die Sitzung neu gestartet hatte (und standardmäßig nicht alle normalen Pakete angehängt hatte), konnte ich sie zum Laufen bringen. Puh.
Charmee

Antworten:

124

n()In dplyr gibt es eine spezielle Funktion zum Zählen von Zeilen (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 countFunktion, die genau das Gleiche mit weniger Eingabe 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
Talat
quelle
16

Ein anderer Ansatz ist die Verwendung der Doppelpunkte:

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

Ich denke, was Sie suchen, ist wie folgt.

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

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

tb.
quelle
Funktioniert bei mir. Der entscheidende Teil ist NICHT die Angabe der Anführungszeichen um Spaltennamen, nach denen gruppiert werden soll.
ivan866
3

Eine weitere Option, die nicht unbedingt eleganter ist, aber nicht auf eine bestimmte Spalte verweisen muss:

mtcars %>% 
  group_by(cyl, gear) %>%
  do(data.frame(nrow=nrow(.)))
Matifou
quelle
1
Das gibt Ihnen nur nrowden Datensatz, nicht die Gruppe
Hack-R