Je veux additionner les lignes qui ont la même valeur dans une colonne:
> df <- data.frame("1"=c("a","b","a","c","c"), "2"=c(1,5,3,6,2), "3"=c(3,3,4,5,2))
> df
X1 X2 X3
1 a 1 3
2 b 5 3
3 a 3 4
4 c 6 5
5 c 2 2
Pour une colonne (X2), les données peuvent être agrégées pour obtenir les sommes de toutes les lignes qui ont la même valeur X1:
> ddply(df, .(X1), summarise, X2=sum(X2))
X1 X2
1 a 4
2 b 5
3 c 8
Comment puis-je faire de même pour X3 et un nombre arbitraire d'autres colonnes sauf X1?
Voici le résultat que je veux:
X1 X2 X3
1 a 4 7
2 b 5 3
3 c 8 7
ddply(df, "X1", numcolwise(sum))
voir ?numcolwise
pour des détails et des exemples.
aggregate
peut facilement le faire avec l'interface de formule:
aggregate(. ~ X1, data=df, FUN=sum)
## X1 X2 X3
## 1 a 4 7
## 2 b 5 3
## 3 c 8 7
De manière équivalente:
aggregate(cbind(X2, X3) ~ X1, data=df, FUN=sum)
aggregate
est une excellente fonction pour ce genre de choses:
aggregate(df[,-1],df["X1"],sum)
X1 X2 X3
1 a 4 7
2 b 5 3
3 c 8 7
Et une version R de base de la méthode numcolwise
de plyr:
aggregate(df[,sapply(df,is.numeric)],df["X1"],sum)
UNE data.table
solution pour l'efficacité de la mémoire et l'élégance du codage
library(data.table)
DT <- data.table(df)
DT[, lapply(.SD, sum), by = X1]
.SD
est le sous-ensemble de la table data.table pour chaque groupe défini par les valeurs de X1
. Il y a 3 vignettes utiles associées au data.table
paquet.