J'ai le cadre de données suivant
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)
Je veux calculer la moyenne de val1 et val2 groupés par id1 et id2, et simultanément compter le nombre de lignes pour chaque combinaison id1-id2. Je peux effectuer chaque calcul séparément :
# calculate mean
aggregate(. ~ id1 + id2, data = x, FUN = mean)
# count rows
aggregate(. ~ id1 + id2, data = x, FUN = length)
Afin de faire les deux calculs en un seul appel, j'ai essayé
do.call("rbind", aggregate(. ~ id1 + id2, data = x, FUN = function(x) data.frame(m = mean(x), n = length(x))))
Cependant, j'obtiens une sortie brouillée ainsi qu'un avertissement :
# 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)
Je pourrais utiliser le paquet plyr, mais mon ensemble de données est assez grand et plyr est très lent (presque inutilisable) lorsque la taille de l'ensemble de données augmente.
Comment puis-je utiliser aggregate
ou d'autres fonctions pour effectuer plusieurs calculs en un seul appel ?