Wie kann ich verschiedene Aggregatfunktionen auf verschiedene Spalten in R anwenden?
-
13-12-2019 - |
Frage
Wie kann ich verschiedene Aggregatfunktionen auf verschiedene Spalten in R anwenden?Der aggregate()
Die Funktion bietet nur ein zu übergebendes Funktionsargument:
V1 V2 V3
1 18.45022 62.24411694
2 90.34637 20.86505214
1 50.77358 27.30074987
2 52.95872 30.26189013
1 61.36935 26.90993530
2 49.31730 70.60387016
1 43.64142 87.64433517
2 36.19730 83.47232907
1 91.51753 0.03056485
... ... ...
> aggregate(sample,by=sample["V1"],FUN=sum)
V1 V1 V2 V3
1 1 10 578.5299 489.5307
2 2 20 575.2294 527.2222
Wie kann ich mich bewerben? anders Funktion für jede Spalte, d. h.Aggregat V2
mit dem mean()
Funktion und V2
mit dem sum()
Funktion, ohne Aufruf aggregate()
mehrmals?
Lösung
Für diese Aufgabe werde ich verwenden ddply
In plyr
> library(plyr)
> ddply(sample, .(V1), summarize, V2 = sum(V2), V3 = mean(V3))
V1 V2 V3
1 1 578.5299 48.95307
2 2 575.2294 52.72222
Andere Tipps
...Oder die Funktion data.table
im gleichnamigen Paket:
library(data.table)
myDT <- data.table(sample) # As mdsumner suggested, this is not a great name
myDT[, list(sumV2 = sum(V2), meanV3 = mean(V3)), by = V1]
# V1 sumV2 meanV3
# [1,] 1 578.5299 48.95307
# [2,] 2 575.2294 52.72222
Nennen wir den Datenrahmen x
statt sample
was bereits vergeben ist.
BEARBEITEN:
Der by
Die Funktion bietet eine direktere Route als die Funktion „Teilen/Anwenden/Kombinieren“.
by(x, list(x$V1), f)
:BEARBEITEN
lapply(split(x, x$V1), myfunkyfunctionthatdoesadifferentthingforeachcolumn)
Natürlich ist das keine separate Funktion für jede Spalte, aber man kann beide Aufgaben erledigen.
myfunkyfunctionthatdoesadifferentthingforeachcolumn = function(x) c(sum(x$V2), mean(x$V3))
Es sind bequeme Methoden zum Zusammenstellen des Ergebnisses möglich, beispielsweise diese (aber schauen Sie sich das Plyr-Paket für eine umfassende Lösung an, denken Sie über diese Motivation nach, etwas Besseres zu lernen).
matrix(unlist(lapply(split(x, x$V1), myfunkyfunctionthatdoesadifferentthingforeachcolumn)), ncol = 2, byrow = TRUE, dimnames = list(unique(x$V1), c("sum", "mean")))