Ich habe einen Datenrahmen mit zwei Spalten. Die erste Spalte enthält Kategorien wie "Erste", "Zweite", "Dritte", und die zweite Spalte enthält Zahlen, die angeben, wie oft ich die spezifischen Gruppen aus "Kategorie" gesehen habe.
Zum Beispiel:
Category Frequency
First 10
First 15
First 5
Second 2
Third 14
Third 20
Second 3
Ich möchte die Daten nach Kategorie sortieren und alle Häufigkeiten summieren:
Category Frequency
First 30
Second 5
Third 34
Wie würde ich das in R machen?
rowsum
.Antworten:
Verwenden von
aggregate
:Im obigen Beispiel können mehrere Dimensionen in der angegeben werden
list
. Mehrere aggregierte Metriken desselben Datentyps können integriert werden übercbind
:(Einbettung des @ thelatemail-Kommentars),
aggregate
hat auch eine FormelschnittstelleWenn Sie mehrere Spalten zusammenfassen möchten, können Sie die
.
Notation verwenden (funktioniert auch für eine Spalte).oder
tapply
:Verwendung dieser Daten:
quelle
Sie können auch das dplyr- Paket für diesen Zweck verwenden:
Oder für mehrere Zusammenfassungsspalten (funktioniert auch mit einer Spalte):
Im Folgenden finden Sie einige weitere Beispiele für die Zusammenfassung von Daten nach Gruppen mithilfe von dplyr-Funktionen unter Verwendung des integrierten Datensatzes
mtcars
:Weitere Informationen, einschließlich des
%>%
Bedieners, finden Sie in der Einführung zu dplyr .quelle
funs()
Arguments vonsummarise_all
und der zugehörigen Funktionen (summarise_at
,summarise_if
)Die Antwort von rcs funktioniert und ist einfach. Wenn Sie jedoch größere Datenmengen verarbeiten und eine Leistungssteigerung benötigen, gibt es eine schnellere Alternative:
Vergleichen wir das mit data.frame und den oben genannten oben:
Und wenn Sie die Spalte behalten möchten, ist dies die Syntax:
Der Unterschied wird bei größeren Datensätzen deutlicher, wie der folgende Code zeigt:
Für mehrere Aggregationen können Sie kombinieren
lapply
und.SD
wie folgtquelle
data[, sum(Frequency), by = Category]
. Sie können verwenden,.N
welche diesum()
Funktion ersetzt.data[, .N, by = Category]
. Hier ist ein nützliches Cheatsheet: s3.amazonaws.com/assets.datacamp.com/img/blog/…Sie können auch die Funktion by () verwenden:
Diese anderen Pakete (plyr, reshape) haben den Vorteil, dass ein data.frame zurückgegeben wird, aber es lohnt sich, mit () vertraut zu sein, da es sich um eine Basisfunktion handelt.
quelle
Einige Jahre später, nur um eine weitere einfache Basis-R-Lösung hinzuzufügen, die hier aus irgendeinem Grund nicht vorhanden ist:
xtabs
Oder wenn Sie einen
data.frame
Rücken wollenquelle
quelle
Wenn
x
es sich bei Ihren Daten um einen Datenrahmen handelt, wird Folgendes ausgeführt:quelle
Während ich kürzlich
dplyr
für die meisten dieser Arten von Operationen konvertiert wurde , ist dassqldf
Paket für einige Dinge immer noch sehr schön (und meiner Meinung nach besser lesbar).Hier ist ein Beispiel, wie diese Frage beantwortet werden kann
sqldf
quelle
Nur um eine dritte Option hinzuzufügen:
EDIT: Dies ist eine sehr alte Antwort. Jetzt würde ich die Verwendung von
group_by
undsummarise
von empfehlendplyr
, wie in @docendo Antwort.quelle
Ich finde es
ave
sehr hilfreich (und effizient), wenn Sie verschiedene Aggregationsfunktionen auf verschiedene Spalten anwenden müssen (und Sie müssen / wollen auf Basis R bleiben):z.B
Angesichts dieser Eingabe:
wir wollen nach und gruppieren
Categ1
undCateg2
die Summe vonSamples
und den Mittelwert von berechnenFreq
.Hier ist eine mögliche Lösung mit
ave
:Ergebnis:
quelle
Das kürzlich hinzugefügte
dplyr::tally()
macht dies jetzt einfacher als je zuvor:quelle
Sie können die Funktion
group.sum
aus dem Paket Rfast verwenden .Rfast hat viele Gruppenfunktionen und
group.sum
ist eine davon.quelle
Verwenden
cast
anstelle vonrecast
(Hinweis'Frequency'
ist jetzt'value'
)bekommen:
quelle
Eine andere Lösung, die Summen nach Gruppen in einer Matrix oder einem Datenrahmen zurückgibt und kurz und schnell ist:
quelle
Da könnte
dplyr 1.0.0
dieacross()
Funktion verwendet werden:Bei Interesse an mehreren Variablen:
Und die Auswahl von Variablen mit ausgewählten Helfern:
Beispieldaten:
quelle