2017-03-02 7 views
2

I einer Probe mit dem XTS gewissen Datenobjekt haben:mit Umgang gelten Funktionen XTS Objekt in 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) 

I apply.yearly dann darauf mit der Funktion cumsum verwenden:

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

Die Ausgabe ist eine transponierte Matrix, die ich ursprünglich nicht zurückgeben wollte.

würde ich die Schnipsel oben erwarten die gleiche Ausgabe wie zurückzukehren:

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)) 

Das Problem bei der Verwendung anzuwenden ist, dass es eine Matrix und kein xts Objekt zurückgibt. Während ich dies mit Hilfe von as.xts lösen könnte, würde ich gerne wissen, ob etwas fehlt, oder ob ich apply.yearly falsch verwende. Pure Apply scheint eher anfällig für Fehler und Bugs zu sein.

+0

'apply' gibt immer ein' matrix', ob Sie mit ' xts' oder 'dat.frame' – akrun

+0

Verwenden Sie' reclass() ', um es wieder' xts' zu machen: 'reclass (apply (X = xts_object, MARGIN = 2, FUN = Cumsum), match.to = xts_object)' – Rime

+0

Die Ausgabe Ihres Aufrufs "Anwenden" setzt die kumulative Summe nicht jedes Jahr zurück. Es ist das gleiche wie nur 'cumsum (xts_object)' zu nennen. "apply.yearly" sollte auch die kumulative Summe jedes Jahr zurücksetzen. –

Antwort

2

Dies könnte die eleganteste Lösung nicht sein, aber es funktioniert:

# 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" 

Das resultierende Objekt wäre noch „XTS“

+0

Gute Antwort. Dies sollte "apply.yearly" tun. Dass es nicht wie ein Käfer aussieht. Ich muss darüber nachdenken, wie 'period.apply' momentan funktioniert, um zu patchen. –

+0

useR das ist, was ich ursprünglich dachte, habe ich meinen ursprünglichen Beitrag bearbeitet, um zu reflektieren, was Sie antworteten. Wie Joshua bemerkte, ist dies das, was apply.yearly tun sollte, also schätze ich, dass ich apply.yearly nicht falsch benutzt habe und es einen Patch braucht. Danke euch beiden! – Rafolks