Бързо прилагайте xts векторни операции върху широки зоо обекти в R

Това наистина е продължение на моя въпрос вчера, където научих за apply.weekly. Това работи чудесно, но искам да направя това върху широки zoo обекти. Ако използвам apply.weekly на широк zoo, той сумира колоните, след което извършва седмичното агрегиране:

> 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

person Richard Herron    schedule 30.11.2010    source източник
comment
Относно вашата актуализация: инсталирайте xts от R-forge. Джеф поправи това преди няколко седмици, но все още не е стигнало до CRAN.   -  person Joshua Ulrich    schedule 01.12.2010


Отговори (1)


Трябва да използвате функция за колони в 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
person Joshua Ulrich    schedule 30.11.2010
comment
Благодаря! Винаги се срамувам колко е лесно. - person Richard Herron; 01.12.2010
comment
@richardh, ако това е някаква утеха, другите обикновено работят много усилено, за да го направят толкова лесно. ;-) - person Joshua Ulrich; 01.12.2010
comment
Има ли настройка/опция, която трябва да задам, за да избегна необходимостта от транспониране и преработване като zoo? - person Richard Herron; 01.12.2010
comment
@richardh apply.weekly ще върне какъвто и да е клас от времеви серии, предаден му (timeSeries, zoo, its и т.н.). Включих командата за изтегляне на по-нова версия на xts от R-forge. - person Joshua Ulrich; 01.12.2010
comment
Схванах го! Благодаря за образованието. И за утеха: това само засилва смущението... Ще продължа да се уча и ще се опитам да го върна! Благодаря! - person Richard Herron; 01.12.2010