Calcular la suma acumulada para los niveles de una variable anidada
Pregunta
Espero calcular una variable de suma acumulativa, pero calculada dentro de los niveles de una variable anidada determinada.A continuación se muestran algunos datos de ejemplo:
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)))
Quiero un nuevo vector que se vería así:
data$cumsum <- c(1,6,8,15,18,23,1,7,9,13,1,7,10)
Con un producto final 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
¡Gracias!
Solución
Puedes 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
O usando dplyr
:
library(dplyr)
data %>% group_by(ids) %>% mutate(cumsum = cumsum(values))
Otros consejos
debe ser más rápido con data.table
para grandes conjuntos de datos
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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow