Aplicar varias funciones de resumen en varias variables por grupo en una llamada

Tengo el siguiente marco de datos

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)

Quiero calcular la media de val1 y val2 agrupados por id1 e id2, y al mismo tiempo contar el número de filas para cada combinación id1-id2. Puedo realizar cada cálculo por separado:

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

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

Para hacer ambos cálculos en una llamada, lo intenté.

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

Sin embargo, obtengo una salida confusa junto con una advertencia:

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

Podría usar el paquete plyr, pero mi conjunto de datos es bastante grande y plyr es muy lento (casi inutilizable) cuando aumenta el tamaño del conjunto de datos.

Como puedo usaraggregate u otras funciones para realizar varios cálculos en una llamada?

Respuestas a la pregunta(6)

Su respuesta a la pregunta