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?


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

16

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

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

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.


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

1
to daje tylko nrowzestaw danych, a nie grupę
Hack-R
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.