Policz liczbę wierszy według grupy przy użyciu narzędzia dplyr

83

Używam mtcarszbioru danych. Chcę znaleźć liczbę rekordów dla określonej kombinacji danych. Coś bardzo podobnego do count(*)klauzuli group by w SQL. ddply()od Plyr pracuje dla mnie

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

ma wyjście

  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

Używając tego kodu

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

ma wyjście

  length(cyl)
1          32

Znalazłem różne funkcje, do których mogę przejść, summarise()ale żadna z nich nie działa. Jedną z funkcji, którą znalazłem, jest ta sum(G), która zwróciła

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

Próbowałem użyć n(), który wrócił

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

Co ja robię źle? Jak mogę dostać group_by()/ summarise()pracować dla mnie?

Charmee
źródło
Nie mogę tego odtworzyć. Otrzymuję taki sam wynik jak z ddply. Z jakiej wersji dplyr korzystasz? Spróbuj zaktualizować?
joran
Mam najnowszą wersję 0.1.3. Czy masz 0.1.2?
charmee
Nie. Twój przykład działa dobrze dla mnie z 0.1.3.
joran
1
Jaką masz wersję R? Czy to mogło powodować różnicę w zachowaniu? Próbowałem też tego na komputerze w domu, który używa Ubuntu, to samo ...
charmee
2
Dzięki!!! To rozwiązało problem. Jeśli mam dołączone pakiety plyr i dplyr, podsumowanie nie działa zgodnie z oczekiwaniami. Jak tylko zrestartowałem sesję (i domyślnie nie załączyłem wszystkich normalnych pakietów) mogłem sprawić, że zadziała. Uff.
charmee

Odpowiedzi:

126

W n()dplyr jest specjalna funkcja do liczenia wierszy (potencjalnie w grupach):

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

Ale dplyr oferuje również przydatną countfunkcję, która robi dokładnie to samo przy mniejszym pisaniu:

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
źródło
16

innym podejściem jest użycie podwójnych dwukropków:

mtcars %>% 
  dplyr::group_by(cyl, gear) %>%
  dplyr::summarise(length(gear))
user3026255
źródło
9

Myślę, że to, czego szukasz, jest następujące.

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

Używa pakietu dplyr. Jest to zasadniczo odręczna wersja rozwiązania count () dostarczona przez docendo discimus.

tb.
źródło
Pracuje dla mnie. Kluczową częścią NIE jest podawanie cudzysłowów wokół nazw kolumn do grupowania.
ivan866
3

Inna opcja, niekoniecznie bardziej elegancka, ale nie wymagająca odwoływania się do konkretnej kolumny:

mtcars %>% 
  group_by(cyl, gear) %>%
  do(data.frame(nrow=nrow(.)))
Matifou
źródło
1
to daje tylko nrowzestaw danych, a nie grupę
Hack-R