Calcular a soma cumulativa para níveis de aninhamento de variável
Pergunta
Eu estou esperando para calcular uma soma cumulativa variável, mas calculado dentro de níveis de um dado de aninhamento de variável.Eis alguns dados de exemplo:
data <- data.frame(cbind(ids=c(rep(1,6),rep(2,4),rep(3,3)), values=c(1,5,2,7,3,5,1,6,2,4,1,6,3)))
Eu estou querendo um novo vetor que teria esta aparência:
data$cumsum <- c(1,6,8,15,18,23,1,7,9,13,1,7,10)
E um final com um produto como este:
> data
ids values cumsum
1 1 1 1
2 1 5 6
3 1 2 8
4 1 7 15
5 1 3 18
6 1 5 23
7 2 1 1
8 2 6 7
9 2 2 9
10 2 4 13
11 3 1 1
12 3 6 7
13 3 3 10
Obrigado!
Solução
Você pode usar ave
:
transform(data, cumsum = ave(values, ids, FUN = cumsum))
data
# ids values cumsum
#1 1 1 1
#2 1 5 6
#3 1 2 8
#4 1 7 15
#5 1 3 18
#6 1 5 23
#7 2 1 1
#8 2 6 7
#9 2 2 9
#10 2 4 13
#11 3 1 1
#12 3 6 7
#13 3 3 10
Ou usando dplyr
:
library(dplyr)
data %>% group_by(ids) %>% mutate(cumsum = cumsum(values))
Outras dicas
Deve ser o mais rápido, com data.table
para conjuntos de dados grandes
library(data.table)
setDT(data)[, Cumsum:=cumsum(values), by=ids]
data
# ids values Cumsum
# 1: 1 1 1
# 2: 1 5 6
# 3: 1 2 8
# 4: 1 7 15
# 5: 1 3 18
# 6: 1 5 23
# 7: 2 1 1
# 8: 2 6 7
# 9: 2 2 9
# 10: 2 4 13
# 11: 3 1 1
# 12: 3 6 7
# 13: 3 3 10
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow