Zastosuj kilka funkcji podsumowania dla kilku zmiennych według grup w jednym wywołaniu

Mam następującą ramkę danych

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)

Chcę obliczyć średnią wartości val1 i val2 pogrupowanych według id1 i id2, a jednocześnie policzyć liczbę wierszy dla każdej kombinacji id1-id2. Mogę wykonać każde obliczenie osobno:

# calculate mean
aggregate(. ~ id1 + id2, data = x, FUN = mean)

# count rows
aggregate(. ~ id1 + id2, data = x, FUN = length)

Aby wykonać oba obliczenia w jednym połączeniu, spróbowałem

do.call("rbind", aggregate(. ~ id1 + id2, data = x, FUN = function(x) data.frame(m = mean(x), n = length(x))))

Jednak otrzymuję zniekształcony obraz wraz z ostrzeżeniem:

#     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)

Mogłem użyć pakietu plyr, ale mój zestaw danych jest dość duży, a plyr jest bardzo powolny (prawie bezużyteczny), gdy rozmiar zestawu danych rośnie.

Jak mogę korzystaćaggregate lub inne funkcje do wykonania kilku obliczeń w jednym połączeniu?

questionAnswers(6)

yourAnswerToTheQuestion