如何在R中加速以下功能?

如何在R中加速以下功能?,r,optimization,lapply,R,Optimization,Lapply,我有一个名为“marketdata”的数据框架,其中包含3000000行(行名:1到3000000)和2列(colnames:“mid”,“bo”) 我的职能如下: movingWindow <- function (submarketdata) { temp <- submarketdata[submarketdata$bo <= 0.1, ] return( c(mean(temp$mid), NROW(temp)/100) ) } result <

我有一个名为“marketdata”的数据框架,其中包含3000000行(行名:1到3000000)和2列(colnames:“mid”,“bo”)

我的职能如下:

movingWindow <- function (submarketdata) {
   temp <- submarketdata[submarketdata$bo <= 0.1, ]   
   return( c(mean(temp$mid), NROW(temp)/100) )
}

result <- lapply(c(101:NROW(marketdata)), function(i) movingWindow( marketdata[ (i-99):i , ] ))

movingWindow您需要提供
marketdata
的代表性示例。请阅读这篇文章。好吧,您每秒的输出量约为3333。不需要你的
移动窗口
函数,因为它的每个输出都很容易矢量化。你的Alt#2
r2a
方程不应该调用
r1a
,而不是
r1
?@CarlWitthoft谢谢,我已经修好了。你好,罗兰,非常感谢你的帖子。然而,我觉得这个替代方法与我原来的方法产生了不同的结果。在我的函数中,我用“bo”列计算样本的平均值哦,我明白了。我确实犯了一个错误。实际使用“rollsum”/(100*r1)计算平均值,而不是使用返回有效样本量的第一个rollmean函数。非常感谢你。
movingWindow <- function (submarketdata) {
   temp <- submarketdata[submarketdata$bo <= 0.1, ]   
   return( c(mean(temp$mid), NROW(temp)/100) )
}

result <- lapply(c(101:NROW(marketdata)), function(i) movingWindow( marketdata[ (i-99):i , ] ))
set.seed(42)
marketdata <- data.frame(mid=runif(200, 245, 255),
                 bo=runif(200, 0, 0.2))

movingWindow <- function (submarketdata) {
  temp <- submarketdata[submarketdata$bo <= 0.1, ]   
  return( c(mean(temp$mid), NROW(temp)/100) )
}

result <- t(sapply(c(101:NROW(marketdata)), function(i) movingWindow( marketdata[ (i-99):i , ] )))

#faster alternative:
library(zoo)
r1 <- rollmean(marketdata$bo <= 0.1, 100)
all.equal(r1[-1], result[,2])

r2 <- rollsum((marketdata$bo <= 0.1)*marketdata$mid, 100)/(100*r1)

result2 <- cbind(r2, r1)

#same result?
all.equal(result, unname(result2[-1,]))
#[1] TRUE

#base R alternative (assuming there are no NA values in your data)
r1a <- na.omit(filter(marketdata$bo <= 0.1, rep(0.01, 100)))
r2a <- na.omit(filter((marketdata$bo <= 0.1)*marketdata$mid, rep(1, 100)))/(100*r1a)
result2a <- cbind(r2a, r1a)

#same result?
all.equal(result, unname(result2a[-1,]))
#[1] TRUE
Unit: microseconds
        expr        min        lq    median        uq       max neval
    original  19006.144 19435.262 20824.245 21243.524 52965.168   100
alternative1   1444.574  1525.774  1607.264  1646.524  3486.940   100
alternative2    975.366  1006.913  1071.305  1106.437  3117.709   100