【问题标题】:Quickly apply xts vector operations across wide zoo objects in R在 R 中跨动物园对象快速应用 xts 向量操作
【发布时间】:2011-05-18 03:16:45
【问题描述】:

这真的是我昨天了解apply.weeklyquestion 的延伸。这很好用,但我想在宽 zoo 对象上执行此操作。如果我在宽 zoo 上使用 apply.weekly,它会对列求和,然后执行每周聚合:

> 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 循环中执行此操作,但这确实非常耗时(比as.yearmon 周期性上的aggregate 函数慢四倍多)。这是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的所有列?谢谢!

更新:Joshua Ulrich 指出我需要一个列感知功能(如colMeanscolSums)。当我这样做时,我得到了正确的答案,但作为一个转置矩阵。我应该重新分类并继续前进吗?还是我的选项/设置有误?

> 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

【问题讨论】:

  • 关于您的更新:从 R-forge 安装 xts。杰夫在几周前修补了它,但它还没有进入 CRAN。

标签: r aggregate apply zoo xts


【解决方案1】:

您需要在apply.weekly 中使用列感知函数。例如,使用colSums 代替sumcolMeans 代替mean

R-forge 上xts 的最新修订版提供以下输出。 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.weeklyapply的组合:

> 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

【讨论】:

  • 谢谢!我总是很尴尬,这很容易。
  • @richardh 如果有什么安慰的话,其他人通常会非常努力地让它变得简单。 ;-)
  • 我是否需要设置一个设置/选项以避免转置和重铸为zoo
  • @richardh apply.weekly 将返回传递给它的任何时间序列类(timeSeries、zoo、its 等)。我已经包含了从 R-forge 下载更新版本的 xts 的命令。
  • 知道了!感谢教育。并再次安慰:这只会让尴尬更强烈......我会继续学习,并努力回报!谢谢!
猜你喜欢
  • 2015-03-23
  • 1970-01-01
  • 2018-01-21
  • 2020-01-19
  • 2017-02-23
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多