Frage

Das ist wirklich eine Erweiterung meiner Frage gestern, wo ich über apply.weekly gelernt. Dies funktioniert gut, aber ich möchte diese über weite zoo Objekte zu tun. Wenn ich apply.weekly auf einer breiten zoo verwenden sie die Spalten summiert, führt dann die wöchentliche Aggregation:

> 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 

habe ich versucht, 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 arbeitet (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 für alle Spalten mit apply.weekly schnell bedienen? Dank!

UPDATE: Joshua Ulrich weist darauf hin, dass ich eine Spalte bewusst Funktion benötigen (wie colMeans oder colSums). Wenn ich das tue, erhalte ich die richtigen Antworten, sondern als eine transponierte Matrix. Sollte ich nur reklassifizieren und weitermachen? Oder muss 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
War es hilfreich?

Lösung

Sie müssen eine Spalte-aware Funktion in apply.weekly verwenden. Verwenden Sie zum Beispiel colSums statt sum oder colMeans statt mean.

Die neueren Versionen von xts auf R-Schmiede geben den Ausgang unten. Die Version, die derzeit auf CRAN gibt die transponierten Daten.

# 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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top