ti-enxame.com

Soma de linhas com base no valor da coluna

Quero somar linhas que têm o mesmo valor em uma coluna:

> 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

Para uma coluna (X2), os dados podem ser agregados para obter as somas de todas as linhas que têm o mesmo valor X1:

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

Como faço o mesmo para X3 e um número arbitrário de outras colunas, exceto X1?

Este é o resultado que eu quero:

  X1 X2 X3
1  a  4  7
2  b  5  3
3  c  8  7
30
R-obert
ddply(df, "X1", numcolwise(sum))

vejo ?numcolwise para detalhes e exemplos.

26
Ista

aggregate pode fazer isso facilmente com a interface da fórmula:

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

Equivalentemente:

aggregate(cbind(X2, X3) ~ X1, data=df, FUN=sum)
22
Matthew Lundberg

aggregate é uma ótima função para esse tipo de coisa:

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

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

E uma versão R básica do método numcolwise do plyr:

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

UMA data.table solução para eficiência da memória e elegância da codificação

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


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

.SD é o subconjunto da tabela de dados para cada grupo definido pelos valores de X1. Existem 3 vinhetas úteis associadas ao data.table pacote.

5
mnel