2012-10-26 4 views
1

je la trame de données suivantes:Comment accélérer la somme cumulative au sein du groupe?

id<-c(1,1,1,1,1,3,3,3,3) 
spent<-c(10,20,30,40,50,60,70,80,90) 
date<-c("11-11-07","11-11-07","23-11-07","12-12-08","17-12-08","11-11-07","23-11-07","23- 11-07","16-01-08") 
df<-data.frame(id,date,spent) 
df$date2<-as.Date(as.character(df$date), format = "%d-%m-%y") 


id  date spent  date2 
1 1 11-11-07 10 2007-11-11 
2 1 11-11-07 20 2007-11-11 
3 1 23-11-07 30 2007-11-23 
4 1 12-12-08 40 2008-12-12 
5 1 17-12-08 50 2008-12-17 
6 3 11-11-07 60 2007-11-11 
7 3 23-11-07 70 2007-11-23 
8 3 23-11-07 80 2007-11-23 
9 3 16-01-08 90 2008-01-16 

je dois calculer la somme spent par chaque id par jour et inclure dans le cadre de travail comme suit:

id  date spent  date2 sum.spent 
1 1 11-11-07 10 2007-11-11 10 
2 1 11-11-07 20 2007-11-11 30 
3 1 23-11-07 30 2007-11-23 30 
4 1 12-12-08 40 2008-12-12 40 
5 1 17-12-08 50 2008-12-17 50 
6 3 11-11-07 60 2007-11-11 60 
7 3 23-11-07 70 2007-11-23 70 
8 3 23-11-07 80 2007-11-23 150 
9 3 16-01-08 90 2008-01-16 90 

Le script suivant fonctionne bien (sauf pour la première rangée qui n'est pas une grosse affaire):

df$spent2<-NA 
for (a in 2:9) 
if (df[a,1]==df[a-1,1]&& df[a,4]==df[a-1,4]) 
(df[a,5]=df[a,3]+df[a-1,3])else(df[a,5]=df[a,3]) 

Cependant, depuis le nombre de lignes dans mon jeu de données réel est d'environ 1,5 million, le script ci-dessus prend environ 5 jours pour être exécuté. Je me demande si vous pouvez suggérer un moyen plus efficace d'écrire ce code et d'atteindre le même objectif.

Répondre

6

data.table est assez rapide, surtout pour des jeux de données aussi volumineux. Cela devrait fonctionner assez rapidement pour les enregistrements de 1,5 mil.

library(data.table) 
df <- data.table(df) 
df <- df[, sum.spent:=cumsum(spent), by = list(id, date2)] 
+0

Il fonctionne correctement et aussi rapidement ... Merci Mate! – AliCivil

3

Voici une solution de base R:

df$sum.spent <- ave(df$spent,df$id,df$date2,FUN=cumsum) 

je reçois un résultat différent de votre réponse attendue si, mais je pense qu'il est correct?

+0

Probablement parce qu'il n'a pas d'information d'identification? –

+0

Ah oui oublié. Fixé! –

Questions connexes