2013-02-24 16 views
26

Ich möchte Zeilen summieren, die denselben Wert in einer Spalte haben:Summe der Zeilen basierend auf Spaltenwert

> 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 

Für eine Spalte (X2), können die Daten aggregiert werden, um die Summen aller Zeilen zu erhalten dass den gleichen X1-Wert:

> ddply(df, .(X1), summarise, X2=sum(X2)) 
    X1 X2 
1 a 4 
2 b 5 
3 c 8 

Wie mache ich das gleiche für X3 und eine beliebige Anzahl von anderen Spalten außer X1?

Dies ist das Ergebnis Ich möchte:

X1 X2 X3 
1 a 4 7 
2 b 5 3 
3 c 8 7 

Antwort

25
ddply(df, "X1", numcolwise(sum)) 

für Details und Beispiele siehe ?numcolwise.

6

aggregate ist eine großartige Funktion für diese Art von Dingen:

aggregate(df[,-1],df["X1"],sum) 

    X1 X2 X3 
1 a 4 7 
2 b 5 3 
3 c 8 7 

und eine Basis R-Version der numcolwise Methode von plyr:

aggregate(df[,sapply(df,is.numeric)],df["X1"],sum) 
20

aggregate kann dies leicht tun mit der Formel-Schnittstelle :

aggregate(. ~ X1, data=df, FUN=sum) 
## X1 X2 X3 
## 1 a 4 7 
## 2 b 5 3 
## 3 c 8 7 

Äquivalent y:

aggregate(cbind(X2, X3) ~ X1, data=df, FUN=sum) 
5

A data.table Lösung für die Speichereffizienz und Codierungs Eleganz

library(data.table) 
DT <- data.table(df) 


DT[, lapply(.SD, sum), by = X1] 

.SD ist die Teilmenge der data.table für jede Gruppe durch die Werte der X1 definiert. Es gibt 3 hilfreiche Vignetten, die mit dem data.table Paket verbunden sind.

Verwandte Themen