在R中,使用可变滚动窗口大小计算滚动最大值的最快方法是什么?
我有两个数值向量,一个存储计算最大值的值,另一个滚动窗口的长度以滚动的方式计算最大值。下面是一些示例代码。通常我会尝试在system.time中加速代码。有没有现成的函数或矢量化的方法来做同样的事情在R中,使用可变滚动窗口大小计算滚动最大值的最快方法是什么?,r,R,我有两个数值向量,一个存储计算最大值的值,另一个滚动窗口的长度以滚动的方式计算最大值。下面是一些示例代码。通常我会尝试在system.time中加速代码。有没有现成的函数或矢量化的方法来做同样的事情 a <- rep(1:5,20000) set.seed(123) b <- rep(sample(1:50),2000) system.time({ out <- vector(mode='numeric', length=NROW(a)) for(i in seq(a)) {
a <- rep(1:5,20000)
set.seed(123)
b <- rep(sample(1:50),2000)
system.time({
out <- vector(mode='numeric', length=NROW(a))
for(i in seq(a)) {
if (i-b[i]>=0) out[i] <- max(a[(i-b[i]+1):i])
else out[i] <- NA
}
})
a设法将其部分矢量化:
原件-
system.time({
out <- vector(mode='numeric', length=NROW(a))
for(i in seq(a)) {
if (i-b[i]>=0) out[i] <- max(a[(i-b[i]+1):i])
else out[i] <- NA
}
})
## user system elapsed
## 0.64 0.00 0.64
system.time({
out=0)out[i]您可以对该问题的各个部分进行向量化,特别是在需要找出a
(我称之为str
)中的起始索引位置和窗口的结尾(end
),但我必须使用循环构造将这些索引位置应用于a
,以使用mapply
获取max
。如下所示:
x <- seq_len( length(a) )
end <- which( x-b > 0 )
str <- end - b[end]
res <- a
res[ - end ] <- NA
res[end] <- mapply( function(x,y) max( a[ x:y ] ) , str , end )
然而,它并没有那么快:
如果有一种方法可以对上一个操作进行矢量化,那么这将非常快,但我现在想不出任何方法来实现这一点!+1好问题。这是一个值得尝试和优化的有趣问题!
x <- seq_len( length(a) )
end <- which( x-b > 0 )
str <- end - b[end]
res <- a
res[ - end ] <- NA
res[end] <- mapply( function(x,y) max( a[ x:y ] ) , str , end )
identical( res , out )
[1] TRUE
user system elapsed
0.46 0.00 0.47