Pregunta

Esto es realmente una extensión de mi ayer donde aprendí sobre apply.weekly. Esto funciona muy bien, pero yo quiero hacer esto más objetos zoo ancho. Si uso apply.weekly en una amplia zoo que resume las columnas, a continuación, realiza la agregación semanal:

> 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 

He intentado la familia apply de los operadores, pero los que parece que se deben eliminar del índice de fechas zoo. Puedo hacerlo en un bucle for, pero en realidad es mucho tiempo (mucho, mucho más que un factor de cuatro más lenta que la función de la periodicidad aggregate as.yearmon). Aquí está el bucle 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)
}

que funciona (es decir, mantiene cada vector separado):

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

¿Hay una manera de operar rápidamente en todas las columnas con apply.weekly? Gracias!

ACTUALIZACIÓN: Joshua Ulrich señala que necesito una función de uso de la columna (como colMeans o colSums). Cuando hago esto, me da las respuestas correctas, sino como una matriz transpuesta. ¿Debo reclasificar y seguir adelante? O tengo una opción / incorrecto establecer?

> 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
¿Fue útil?

Solución

Se necesita usar una función de columna-conscientes en apply.weekly. Por ejemplo, el uso colSums en lugar de sum o colMeans en lugar de mean.

Las más recientes revisiones de xts en R-forge dar la salida a continuación. La versión actualmente en CRAN devuelve los datos transpuestos.

# 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 es necesario utilizar una función personalizada, se puede utilizar una combinación de apply.weekly y 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top