2013-02-24 45 views
26

Chcę podsumować wiersze, które mają taką samą wartość w jednej kolumnie:Suma wierszy na podstawie wartości kolumny

> 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 

Dla jednej kolumnie (2x), dane mogą być łączone w celu uzyskania sumy wszystkich wierszy które mają taką samą wartość X1:

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

Jak mogę zrobić to samo dla X3 i dowolnej liczby innych kolumn z wyjątkiem X1?

Jest to wynik chcę:

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

Odpowiedz

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

zobaczyć ?numcolwise do szczegółów i przykładów.

6

aggregate jest wielki funkcja dla tego rodzaju rzeczy:

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

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

I wersja bazowa R metody numcolwise z plyr:

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

aggregate można łatwo zrobić z interfejsem wzorze :

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

Równoważnik r:

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

data.table rozwiązanie wydajność pamięci i kodowania elegancji

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


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

.SD jest podzbiorem data.table dla każdej grupy określonym przez wartości X1. Istnieją 3 pomocne winiety związane z pakietem data.table.

Powiązane problemy