2010-11-30 2 views
3

Это действительно расширение моего question вчера, где я узнал о apply.weekly. Это отлично работает, но я хочу сделать это по широким объектам zoo. Если я использую apply.weekly на широкий zoo он суммирует столбцы, а затем выполняет еженедельную агрегацию:Быстрое применение векторных операций xts через объекты широкого зоопарка в 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 

Я попробовал apply семейство операторов, но те, кажется, раздеть индекс zoo даты. Я могу сделать это в цикле for, но это действительно отнимает много времени (намного, намного больше, чем в четыре раза медленнее, чем функция aggregate на периодичности as.yearmon). Вот 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) 
} 

, который работает (т.е. сохраняет каждый вектор отдельный):

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 

Есть ли способ, чтобы быстро работать на всех колонках с apply.weekly? Благодаря!

ОБНОВЛЕНИЕ: Джошуа Ульрих указывает, что мне нужна функция, известная в столбце (например, colMeans или colSums). Когда я это делаю, я получаю правильные ответы, но как транспонированную матрицу. Должен ли я просто переклассифицироваться и двигаться дальше? Или у меня есть опция/установка неправильно?

> 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

Что касается вашего обновления: установить XTS из R-кузницы. Джефф заплатил, что несколько недель назад, но он еще не дошел до CRAN. – 2010-11-30 21:54:29

ответ

5

Необходимо использовать функцию поддержки столбца в apply.weekly. Например, используйте colSums вместо sum или colMeans вместо mean.

Более поздние версии xts на R-forge дают результат ниже. В настоящее время версия CRAN возвращает данные, перенесенные.

# 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 

Если вам нужно использовать пользовательскую функцию, вы можете использовать комбинацию apply.weekly и 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 
+0

Спасибо! Я всегда смущен, как легко. – 2010-11-30 21:20:25

 Смежные вопросы

  • Нет связанных вопросов^_^