2010-11-30 10 views
3

Dies ist wirklich eine Erweiterung meiner question gestern, wo ich über apply.weekly gelernt habe. Das funktioniert super, aber ich möchte dies über weite zoo Objekte tun. Wenn ich apply.weekly auf einer breiten zoo verwenden sie die Spalten summiert, führt dann die wöchentliche Aggregation:Schnell XTS-Vektor-Operationen über breite Zoo-Objekte in R

> library(xts) 
> set.seed(2001) 
> zoo.daily <- zoo(data.frame(a=rnorm(20), b=rnorm(20), c=rnorm(20)), order.by=as.Date("2001-05-25") + 0:19) 
> apply.weekly(zoo.daily, sum) 
2001-05-27 2001-06-03 2001-06-10 2001-06-13 
    1.091999 -3.017688 3.842305 2.045370 
> apply.weekly(zoo.daily[, 1] + zoo.daily[, 2] + zoo.daily[, 3], sum) 
2001-05-27 2001-06-03 2001-06-10 2001-06-13 
    1.091999 -3.017688 3.842305 2.045370 

Ich versuchte, die apply Familie von Operatoren, aber die scheinen den zoo Datum Index Streifen aus. Ich kann es in einer for Schleife tun, aber es ist wirklich zeitaufwendig (viel, viel mehr als ein Faktor von vier langsamer als die aggregate Funktion auf as.yearmon Periodizität). Hier ist die for Schleife:

week.ends <- index(zoo.daily[endpoints(zoo.daily, "weeks")[-1], ]) 
num.weeks <- nweeks(zoo.daily) 
num.stocks <- ncol(zoo.daily) 
zoo.weeks <- zoo(matrix(NA, num.weeks, num.stocks), order.by=week.ends) 
for (i in seq(num.stocks)) { 
    zoo.weeks[, i] <- apply.weekly(zoo.daily[, i], mean) 
} 

Welche Werke (das heißt, hält jeden Vektor separat):

2001-05-27 -0.36663040 -0.108648725 0.8392788 
2001-06-03 0.33032998 0.003025018 -0.7644534 
2001-06-10 0.07816992 0.620198931 -0.1494681 
2001-06-13 0.02114608 0.956226189 -0.2955824 

Gibt es eine Möglichkeit, um schnell auf alle Spalten arbeiten mit apply.weekly? Vielen Dank!

UPDATE: Joshua Ulrich weist darauf hin, dass ich eine Spalte bewusste Funktion (wie colMeans oder colSums) benötigen. Wenn ich das mache, bekomme ich die richtigen Antworten, aber als eine transponierte Matrix. Sollte ich einfach umziehen und weitermachen? Oder habe ich eine Option/Einstellung falsch?

> apply.weekly(zoo.daily, colSums) 
     [,1]  [,2]  [,3]  [,4] 
a -1.0998912 2.31230989 0.5471894 0.06343824 
b -0.3259462 0.02117512 4.3413925 2.86867857 
c 2.5178365 -5.35117351 -1.0462765 -0.88674717 
+0

In Bezug auf Ihre Update: installieren xts von R-Schmiede. Jeff hat das vor ein paar Wochen gepatcht, aber bis jetzt ist es noch nicht bei CRAN gelandet. –

Antwort

5

Sie müssen eine spaltenbewusste Funktion in apply.weekly verwenden. Verwenden Sie z. B. colSums anstelle von sum oder colMeans anstelle von mean.

Die neueren Revisionen von xts auf R-Schmiede geben die Ausgabe unten. Die aktuelle Version von CRAN gibt die übertragenen Daten zurück.

# install.packages("xts", repos="http://r-forge.r-project.org") 
> apply.weekly(zoo.daily, colSums) 
        a   b   c 
2001-05-27 -1.09989120 -0.32594617 2.5178365 
2001-06-03 2.31230989 0.02117512 -5.3511735 
2001-06-10 0.54718941 4.34139252 -1.0462765 
2001-06-13 0.06343824 2.86867857 -0.8867472 
> apply.weekly(zoo.daily, colMeans) 
        a   b   c 
2001-05-27 -0.36663040 -0.108648725 0.8392788 
2001-06-03 0.33032998 0.003025018 -0.7644534 
2001-06-10 0.07816992 0.620198931 -0.1494681 
2001-06-13 0.02114608 0.956226189 -0.2955824 

Wenn Sie eine benutzerdefinierte Funktion verwenden müssen, können Sie eine Kombination von apply.weekly und apply verwenden:

> apply.weekly(zoo.daily, function(x) apply(x,2,mean)) 
        a   b   c 
2001-05-27 -0.36663040 -0.108648725 0.8392788 
2001-06-03 0.33032998 0.003025018 -0.7644534 
2001-06-10 0.07816992 0.620198931 -0.1494681 
2001-06-13 0.02114608 0.956226189 -0.2955824 
+0

Danke! Es ist mir immer peinlich, wie einfach es ist. –

+2

@richardh Wenn es einen Trost gibt, arbeiten andere normalerweise sehr hart, um es so einfach zu machen. ;-) –

+0

Gibt es eine Einstellung/Option, die ich einstellen muss, um zu vermeiden, dass ich "Zoo" transponiere und umforme? –