2017-03-02 1 views
2

je la certaines données objet de d'un échantillon:Faire face à appliquer des fonctions d'objets XTS dans R

dates <- seq.Date(from = as.Date("2010-01-01", format = "%Y-%m-%d"), 
to = as.Date("2013-12-01", format = "%Y-%m-%d"), by = "month") 

sample_data <- cbind(1:length(dates),length(dates):1) 

xts_object <- xts(x = sample_data, order.by = dates) 

J'utilise ensuite apply.yearly dessus avec la fonction cumsum:

apply.yearly(x = xts_object, FUN = cumsum) 

La sortie est une matrice transposée, ce qui n'est pas ce que je l'ai initialement prévu de renvoyer.

je me attends à l'extrait ci-dessus pour retourner la même sortie que:

rbind(apply(X = xts_object[1:12],MARGIN = 2,FUN = cumsum), 
apply(X = xts_object[13:24],MARGIN = 2,FUN = cumsum), 
apply(X = xts_object[25:36],MARGIN = 2,FUN = cumsum), 
apply(X = xts_object[37:48],MARGIN = 2,FUN = cumsum), 
apply(X = xts_object[49:60],MARGIN = 2,FUN = cumsum), 
apply(X = xts_object[61:72],MARGIN = 2,FUN = cumsum), 
apply(X = xts_object[73:84],MARGIN = 2,FUN = cumsum)) 

Le problème avec l'utilisation appliquer est qu'il retourne une matrice et non un objet XTS. Bien que je puisse résoudre ceci en utilisant as.xts, j'aimerais savoir s'il y a quelque chose qui me manque ou si j'utilise apply.yearly incorrectement. En utilisant l'application pure semble être plus enclin à attraper les erreurs et les bugs.

+0

'apply' renvoie toujours un' matrix' si vous utilisez ' xts' ou 'data.frame' – akrun

+0

Il suffit d'utiliser' reclass() 'pour le rendre' xts': 'reclass (apply (X = xts_object, MARGIN = 2, FUN = cumsum), match.to = xts_object)' – Rime

+0

La sortie de votre appel 'apply' ne réinitialise pas la somme cumulative chaque année. C'est la même chose que d'appeler 'cumsum (xts_object)'. 'apply.yearly' devrait également réinitialiser la somme cumulative chaque année. –

Répondre

2

Cela pourrait ne pas être la solution la plus élégante, mais il fonctionne:

# Split xts_object by year 
xts_list = split(xts_object, "years") 
# cumsum for each year 
cumsum_list = lapply(xts_list, FUN = cumsum) 
# rbind them together 
do.call(rbind, cumsum_list) 

#    [,1] [,2] 
# 2010-01-01 1 48 
# 2010-02-01 3 95 
# 2010-03-01 6 141 
# 2010-04-01 10 186 
# 2010-05-01 15 230 
# 2010-06-01 21 273 
# 2010-07-01 28 315 
# 2010-08-01 36 356 
# 2010-09-01 45 396 
# 2010-10-01 55 435 
# 2010-11-01 66 473 
# 2010-12-01 78 510 
# 2011-01-01 13 36 
# 2011-02-01 27 71 
# 2011-03-01 42 105 
# 2011-04-01 58 138 
# 2011-05-01 75 170 
# 2011-06-01 93 201 
# 2011-07-01 112 231 
# 2011-08-01 132 260 
# 2011-09-01 153 288 
# 2011-10-01 175 315 
# 2011-11-01 198 341 
# 2011-12-01 222 366 
# 2012-01-01 25 24 
# 2012-02-01 51 47 
# 2012-03-01 78 69 
# 2012-04-01 106 90 
# 2012-05-01 135 110 
# 2012-06-01 165 129 
# 2012-07-01 196 147 
# 2012-08-01 228 164 
# 2012-09-01 261 180 
# 2012-10-01 295 195 
# 2012-11-01 330 209 
# 2012-12-01 366 222 
# 2013-01-01 37 12 
# 2013-02-01 75 23 
# 2013-03-01 114 33 
# 2013-04-01 154 42 
# 2013-05-01 195 50 
# 2013-06-01 237 57 
# 2013-07-01 280 63 
# 2013-08-01 324 68 
# 2013-09-01 369 72 
# 2013-10-01 415 75 
# 2013-11-01 462 77 
# 2013-12-01 510 78 

class(do.call(rbind, cumsum_list)) 
# [1] "xts" "zoo" 

L'objet résultant serait encore « XTS »

+0

Bonne réponse. C'est ce que 'apply.yearly' devrait faire. Cela ne semble pas être un bug. Je vais devoir réfléchir à la façon dont 'period.apply' fonctionne actuellement pour corriger. –

+0

useR C'est ce que je pensais à l'origine, j'ai édité mon post original pour refléter ce que vous avez répondu. Comme l'a commenté Joshua, c'est ce que apply.yearly devrait faire, donc je suppose que je n'utilisais pas vraiment apply.yearly à tort et il a besoin d'un patch. Merci à vous deux! – Rafolks