Ich habe den folgenden Datenrahmen
x <- read.table(text = " id1 id2 val1 val2
1 a x 1 9
2 a x 2 4
3 a y 3 5
4 a y 4 9
5 b x 1 7
6 b y 4 4
7 b x 3 9
8 b y 2 8", header = TRUE)
Ich möchte den Mittelwert von val1 und val2 berechnen, gruppiert nach id1 und id2, und gleichzeitig die Anzahl der Zeilen für jede Kombination aus id1 und id2 zählen. Ich kann jede Berechnung separat durchführen:
# calculate mean
aggregate(. ~ id1 + id2, data = x, FUN = mean)
# count rows
aggregate(. ~ id1 + id2, data = x, FUN = length)
Um beide Berechnungen in einem Aufruf durchzuführen, habe ich es versucht
do.call("rbind", aggregate(. ~ id1 + id2, data = x, FUN = function(x) data.frame(m = mean(x), n = length(x))))
Ich erhalte jedoch eine verstümmelte Ausgabe zusammen mit einer Warnung:
# m n
# id1 1 2
# id2 1 1
# 1.5 2
# 2 2
# 3.5 2
# 3 2
# 6.5 2
# 8 2
# 7 2
# 6 2
# Warning message:
# In rbind(id1 = c(1L, 2L, 1L, 2L), id2 = c(1L, 1L, 2L, 2L), val1 = list( :
# number of columns of result is not a multiple of vector length (arg 1)
Ich könnte das Plyr-Paket verwenden, aber mein Datensatz ist ziemlich groß und Plyr ist sehr langsam (fast unbrauchbar), wenn die Größe des Datensatzes zunimmt.
Wie kann ich aggregate
oder andere Funktionen verwenden, um mehrere Berechnungen in einem Aufruf durchzuführen?
aggregate
in den Antworten erwähnten gibt es auchby
undtapply
.