2017-07-12 1 views
0

je dois calculer le cumsum en cours d'exécution par groupe en R, mais la fenêtre sur laquelle cumsum ne doit être les 3 dernières observations:R cumsum queue par groupe

Si, par exemple, j'ai une table avec le nom d'une personne, une date et une note comme suit:

Name  Date Score 
1 John 2017-01-01  4 
2 John 2017-01-02  5 
3 John 2017-01-03  3 
4 John 2017-01-04  1 
5 John 2017-01-05  4 
6 John 2017-01-06  4 
7 Ben 2017-01-01  4 
8 Ben 2017-01-02  4 
9 Ben 2017-01-03  5 
10 Ben 2017-01-04  2 
11 Ben 2017-01-05  3 
12 Ben 2017-01-06  4 
13 Ben 2017-01-07  4 
14 Ben 2017-01-08  4 

Je veux ajouter une « cumsum personnalisée » colonne qui cumsums (par groupe) les scores des trois derniers jours, à savoir que je veux le résultat suivant:

Name  Date Score Special_cum_sum 
1 John 2017-01-01  4    4 
2 John 2017-01-02  5    9 
3 John 2017-01-03  3    12 
4 John 2017-01-04  1    9 
5 John 2017-01-05  4    8 
6 John 2017-01-06  4    9 
7 Ben 2017-01-01  4    4 
8 Ben 2017-01-02  4    8 
9 Ben 2017-01-03  5    13 
10 Ben 2017-01-04  2    11 
11 Ben 2017-01-05  3    10 
12 Ben 2017-01-06  4    9 
13 Ben 2017-01-07  4    11 
14 Ben 2017-01-08  4    12 

Répondre

3

Vous pouvez utiliser zoos rollapply combiné avec dplyrs group_by et muter:

library(zoo) 
library(dplyr) 
?rollapply 
Data <- Data %>% group_by(Name) %>% 
    mutate(Special_cum_sum = rollapply(Score, 3, sum, align = "right", partial = T)) 
+0

très sexy merci! – gmarais