Ho il seguente data frame
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)
Voglio calcolare la media di val1 e val2 raggruppate per id1 e id2 e contare simultaneamente il numero di righe per ciascuna combinazione id1-id2. Posso eseguire ogni calcolo separatamente:
# calculate mean
aggregate(. ~ id1 + id2, data = x, FUN = mean)
# count rows
aggregate(. ~ id1 + id2, data = x, FUN = length)
Per fare entrambi i calcoli in una chiamata, ho provato
do.call("rbind", aggregate(. ~ id1 + id2, data = x, FUN = function(x) data.frame(m = mean(x), n = length(x))))
Tuttavia, ottengo un output confuso insieme a un avviso:
# 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)
Potrei usare il pacchetto plyr, ma il mio set di dati è abbastanza grande e plyr è molto lento (quasi inutilizzabile) quando la dimensione del set di dati aumenta.
Come posso utilizzare aggregateo altre funzioni per eseguire più calcoli in una chiamata?
aggregatemenzionati nelle risposte ci sono anchebyetapply.