Używam mtcars
zbioru 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?
ddply
. Z jakiej wersji dplyr korzystasz? Spróbuj zaktualizować?Odpowiedzi:
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ą
count
funkcję, 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
źródło
innym podejściem jest użycie podwójnych dwukropków:
mtcars %>% dplyr::group_by(cyl, gear) %>% dplyr::summarise(length(gear))
źródło
Myślę, że to, czego szukasz, jest następujące.
Używa pakietu dplyr. Jest to zasadniczo odręczna wersja rozwiązania count () dostarczona przez docendo discimus.
źródło
Inna opcja, niekoniecznie bardziej elegancka, ale nie wymagająca odwoływania się do konkretnej kolumny:
źródło
nrow
zestaw danych, a nie grupę