如何在R中加速以下功能?
我有一个名为“marketdata”的数据框架,其中包含3000000行(行名:1到3000000)和2列(colnames:“mid”,“bo”) 我的职能如下:如何在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 <
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#2r2a
方程不应该调用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