Appliquer rapidement les opérations vectorielles XTS à travers des objets grand zoo R
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
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