Calculer la somme cumulée pour les niveaux d'une variable d'imbrication
Question
J'espère calculer une variable de somme cumulée, mais calculée dans les niveaux d'une variable d'imbrication donnée.Voici quelques exemples de données :
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)))
Je recherche un nouveau vecteur qui ressemblerait à ceci :
data$cumsum <- c(1,6,8,15,18,23,1,7,9,13,1,7,10)
Avec un produit final comme celui-ci :
> 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
Merci!
La solution
Vous pouvez utiliser 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 en utilisant dplyr
:
library(dplyr)
data %>% group_by(ids) %>% mutate(cumsum = cumsum(values))
Autres conseils
Ça devrait être plus rapide avec data.table
pour les grands ensembles de données
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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow