2015-11-18 5 views
1

Je veux calculer la moyenne mobile pour toutes les variables dans la colonne "sp". Ceci est un exemple de mes données:utiliser rollapply et zoo pour calculer la moyenne mobile d'une colonne de variables

the_date sp wins 
01-06--2012 1 305 
02-06--2012 1 276 
03-06--2012 1 184 
04-06--2012 1 248 
05-06--2012 1 243 
06-06--2012 1 363 
07-06--2012 1 272 
01-06--2012 2 432 
02-06--2012 2 369 
03-06--2012 2 302 
04-06--2012 2 347 
05-06--2012 2 357 
06-06--2012 2 331 
07-06--2012 2 380 
01-06--2012 3 1 
02-06--2012 3 2 
03-06--2012 3 3 
04-06--2012 3 2 
05-06--2012 3 0 
06-06--2012 3 2 
07-06--2012 3 0 

Ce que je veux, est d'avoir une colonne ajoutée aux données, qui donne à la moyenne mobile sur 3 jours pour chaque sp. Donc, la sortie suivante est ce que je désire:

the_date sp wins SMA_wins 
01-06--2012 1 305  305.00 
02-06--2012 1 276  290.50 
03-06--2012 1 184  255.00 
04-06--2012 1 248  236.00 
05-06--2012 1 243  225.00 
06-06--2012 1 363  284.67 
07-06--2012 1 272  292.67 
01-06--2012 2 432  432.00 
02-06--2012 2 369  400.50 
03-06--2012 2 302  367.67 
04-06--2012 2 347  339.33 
05-06--2012 2 357  335.33 
06-06--2012 2 331  345.00 
07-06--2012 2 380  356.00 
01-06--2012 3 1  1.00 
02-06--2012 3 2  1.50 
03-06--2012 3 3  2.00 
04-06--2012 3 2  2.33 
05-06--2012 3 0  1.67 
06-06--2012 3 2  1.33 
07-06--2012 3 0  0.67 

J'utilise rollapply.

df <- group_by(df, sp) 
df_zoo <- zoo(df$wins, df$the_date) 
mutate(df, SMA_wins=rollapplyr(df_zoo, 3, mean, align="right", partial=TRUE)) 

Si je filtre mes données sur un sp spécifique, cela fonctionne parfaitement.

Comment puis-je faire ce travail lorsque je grouper par sp?

Merci

Répondre

3

Vous pouvez le faire comme ceci:

library(dplyr) 
library(zoo) 

df %>% group_by(sp) %>% 
     mutate(SMA_wins=rollapplyr(wins, 3, mean, partial=TRUE)) 

Il semble que votre utilisation de df et df_zoo dans votre mutate appel a été tout embrouiller.

+0

Merci @jeremycg. Cela donne le bon résultat. Cependant, il fonctionne indépendamment de la colonne "the_date". Fondamentalement, il prend les échantillons de manière séquentielle. Cela fonctionne si mes données d'entrée sont triées par date mais que se passe-t-il si ce n'est pas le cas? – ah25

+0

Ajouter dans 'arrange (the_date)' – jeremycg