2013-02-24 6 views
26

Я хочу суммировать строки, которые имеют одинаковое значение в одном столбце:Сумма строк на основе значения столбца

> 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 

Для одного столбца (X2), данные могут быть объединены, чтобы получить суммы всех строк которые имеют такое же значение X1:

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

Как сделать то же самое для X3 и произвольного числа других столбцов, кроме X1?

Это результат я хочу:

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

ответ

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

см ?numcolwise для деталей и примеров.

6

aggregate является прекрасной функцией для такого рода вещей:

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

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

И версия базы R метода numcolwise из plyr:

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

aggregate может легко сделать это с помощью формулы интерфейса :

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

Эквивалент у:

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

data.table решения для эффективности памяти и кодирование элегантности

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


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

.SD это подмножество data.table для каждой группы, определенных значениями X1. Есть 3 полезные виньетки, связанные с пакетом data.table.

Смежные вопросы