Mam ramkę danych z dwiema kolumnami. Pierwsza kolumna zawiera kategorie takie jak „Pierwsza”, „Druga”, „Trzecia”, a druga kolumna zawiera liczby reprezentujące liczbę wyświetleń określonych grup z „Kategorii”.
Na przykład:
Category Frequency
First 10
First 15
First 5
Second 2
Third 14
Third 20
Second 3
Chcę posortować dane według kategorii i zsumować wszystkie częstotliwości:
Category Frequency
First 30
Second 5
Third 34
Jak mam to zrobić w R?
rowsum
.Odpowiedzi:
Używanie
aggregate
:W powyższym przykładzie można określić wiele wymiarów w
list
. Wiele zagregowanych danych tego samego typu danych można włączyć za pomocącbind
:(osadzanie komentarza @ thelatemail),
aggregate
ma również interfejs formułyLub jeśli chcesz agregować wiele kolumn, możesz użyć
.
notacji (działa również dla jednej kolumny)lub
tapply
:Korzystanie z tych danych:
źródło
Możesz również użyć do tego celu pakietu dplyr :
Lub w przypadku wielu kolumn podsumowań (działa również z jedną kolumną):
Oto kilka innych przykładów podsumowywania danych według grup przy użyciu funkcji dplyr przy użyciu wbudowanego zestawu danych
mtcars
:Aby uzyskać więcej informacji, w tym
%>%
operatora, zobacz wprowadzenie do dplyr .źródło
funs()
argumenciesummarise_all
i powiązane z nim funkcje (summarise_at
,summarise_if
)Odpowiedź udzielona przez rcs działa i jest prosta. Jeśli jednak operujesz większymi zestawami danych i potrzebujesz zwiększenia wydajności, istnieje szybsza alternatywa:
Porównajmy to do tej samej rzeczy przy użyciu data.frame i powyższego:
A jeśli chcesz zachować kolumnę, jest to składnia:
Różnica stanie się bardziej zauważalna przy większych zestawach danych, jak pokazuje poniższy kod:
W przypadku wielu agregacji można łączyć
lapply
i.SD
w następujący sposóbźródło
data[, sum(Frequency), by = Category]
. Możesz użyć,.N
który zastępujesum()
funkcję.data[, .N, by = Category]
. Oto przydatny ściągawka: s3.amazonaws.com/assets.datacamp.com/img/blog/…Możesz także użyć funkcji by () :
Te inne pakiety (plyr, reshape) mają tę zaletę, że zwracają data.frame, ale warto zapoznać się z (), ponieważ jest to funkcja podstawowa.
źródło
Kilka lat później, aby dodać kolejne proste podstawowe rozwiązanie R, które nie jest tutaj obecne z jakiegoś powodu-
xtabs
Lub jeśli chcesz
data.frame
plecyźródło
źródło
Jeśli
x
jest to ramka danych z Twoimi danymi, następujące czynności zrobią, co chcesz:źródło
Chociaż ostatnio stałem się konwertowany
dplyr
na większość tego typu operacji, tosqldf
pakiet jest nadal bardzo ładny (i IMHO bardziej czytelny) dla niektórych rzeczy.Oto przykład, w jaki sposób można odpowiedzieć na to pytanie
sqldf
źródło
Aby dodać trzecią opcję:
EDYCJA: to bardzo stara odpowiedź. Teraz poleciłbym użycie
group_by
isummarise
oddplyr
, jak w odpowiedzi @docendo.źródło
znajduję
ave
bardzo pomocny (i wydajny), gdy trzeba zastosować różne funkcje agregacji w różnych kolumnach (i musisz / chcesz trzymać się podstawy R):na przykład
Biorąc pod uwagę ten wkład:
chcemy przez grupy
Categ1
iCateg2
i obliczyć sumęSamples
i średnioFreq
.Oto możliwe rozwiązanie za pomocą
ave
:Wynik:
źródło
Ostatnio dodane
dplyr::tally()
teraz sprawia, że jest to łatwiejsze niż kiedykolwiek:źródło
Możesz użyć funkcji
group.sum
z pakietu Rfast .Rfast ma wiele funkcji grupowych i
group.sum
jest jedną z nich.źródło
używanie
cast
zamiastrecast
(uwaga'Frequency'
jest teraz'value'
)uzyskać:
źródło
Inne rozwiązanie, które zwraca sumy według grup w macierzy lub ramce danych i jest krótkie i szybkie:
źródło
Ponieważ
dplyr 1.0.0
Theacross()
funkcja może być używana:W przypadku zainteresowania wieloma zmiennymi:
A wybór zmiennych za pomocą select helpers:
Przykładowe dane:
źródło