在Rollapply或apply.rolling中应用/ Plyr之类的功能,而不会影响性能

Sum*_*ena 2 r

我想在非时间序列数据上使用roll apply like功能,但是在滚动窗口上计算.所以没有必要将它转换为zoo对象并再次返回.有没有办法可以在非常大的数据集上完成?

编辑

我在用

rollapply(zoo(SPYTS[, "Close"]), 2, function(x) x[1] + x[2], fill=0, align="right") 
Run Code Online (Sandbox Code Playgroud)

在100万个数据点上.这使得从不接缝停止计算.就像是

SPYTS$LnReturns <- (rbind(0, as.data.frame(log(SPYTS[1:(nrow(SPYTS) - 1), "Close"] / SPYTS[2:nrow(SPYTS), "Close"])))) 
Run Code Online (Sandbox Code Playgroud)

只需几秒钟.

该功能function(x) x[1] + x[2]只是一个占位符.我想到的实际功能略有不同.

G. *_*eck 5

这个答案是我之前删除的早期评论的扩展版本.

zoo rollapply已经支持普通的向量和矩阵.此外,它的rollapply例程在动作之前从动物园对象中提取普通向量或矩阵,因此动物园对象没有理由比非动物园对象长得多.您观察到的缓慢是rollapply11月初在开发版本中修复的错误(提取没有正确进行).这个版本在R-Forge上,安装方式如下:

install.packages("zoo", repo = "http://r-forge.r-project.org")
Run Code Online (Sandbox Code Playgroud)

另一方面,一般性rollapply意味着它将比特殊用途例程或矢量化操作慢得多.

动物园确实有一些专门的版本rollapply(rollmean,rollmedian,rollmax),这些特定操作进行了优化,并会快很多.如果你可以用那些来制造东西,例如k个术语的滚动总和与k滚动均值的次数相同,那么你可以获得大幅加速.更快的将是通过诸如的简单操作来制造滚动结果+.

该帖子表明,所讨论的功能仅仅是一个例子,但是特定的功能可以在速度方面产生很大的不同,因为它将影响所讨论的加速类型是否可用.

例如,运行每个的3个复制rollapply,2 * rollmean并且一个简单的向量化加法显示:

> library(zoo)
> library(rbenchmark)
> n <- 10^4
> set.seed(123)
> a <- rnorm(n)
> library(rbenchmark)
> benchmark(rollapply = a1 <- rollapplyr(a, 2, sum, fill = 0),
+    rollmean = a2 <- 2 * rollmeanr(a, 2, fill = 0),
+    add = a3 <- c(0, a[-1] + a[-n]), replications = 3, order = "relative")
       test replications elapsed relative user.self sys.self user.child sys.child
3       add            3    0.00  0.00000      0.00        0         NA        NA
2  rollmean            3    0.07  1.00000      0.08        0         NA        NA
1 rollapply            3    1.85 26.42857      1.84        0         NA        NA
> 
> all.equal(a1, a2)
[1] TRUE
> all.equal(a1, a3)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)