Question

Ceci est vraiment une extension de mon de hier où j'appris apply.weekly. Cela fonctionne très bien, mais je veux le faire sur de larges objets zoo. Si j'utilise apply.weekly sur un large zoo il résume les colonnes, puis effectue l'agrégation hebdomadaire:

> 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 

J'ai essayé la famille apply des opérateurs, mais ceux qui semblent dépouiller l'indice de la date de zoo. Je peux le faire dans une boucle de for, mais il est vraiment temps (beaucoup, beaucoup plus d'un facteur quatre plus lent que la fonction aggregate sur la périodicité de as.yearmon). Voici la boucle de for:

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

Ce qui fonctionne (à savoir, conserve chaque vecteur séparé):

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

Est-il possible d'opérer rapidement sur toutes les colonnes avec apply.weekly? Merci!

MISE À JOUR: Joshua Ulrich souligne que je besoin d'une fonction au courant de la colonne (comme colMeans ou colSums). Quand je fais cela, je reçois les bonnes réponses, mais comme une matrice transposée. Devrais-je passer et de reclasser? Ou dois-je une option / mauvaise position?

> 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
Était-ce utile?

La solution

Vous devez utiliser une fonction de colonne au courant dans apply.weekly. Par exemple, l'utilisation colSums au lieu de sum ou colMeans au lieu de mean.

Les révisions les plus récentes de xts sur R-forge donnent la sortie ci-dessous. La version actuellement renvoie les données CRAN transposés.

# 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

Si vous avez besoin d'utiliser une fonction personnalisée, vous pouvez utiliser une combinaison de apply.weekly et apply:

> 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
scroll top