在R中,使用可变滚动窗口大小计算滚动最大值的最快方法是什么?

在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)) {

我有两个数值向量,一个存储计算最大值的值,另一个滚动窗口的长度以滚动的方式计算最大值。下面是一些示例代码。通常我会尝试在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)) {
  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