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

use*_*038 6 r

我有2个数字向量,一个存储值来计算最大值,滚动窗口的另一个长度用于计算滚动基础上的最大值.下面是一些示例代码.一般来说,我正在尝试加速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
}
})
Run Code Online (Sandbox Code Playgroud)

Nis*_*nth 1

设法对其部分进行矢量化:

原来的 -

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 
Run Code Online (Sandbox Code Playgroud)

稍微矢量化 -

system.time({
  nr <- NROW(a)
  out <- rep(NA,nr)
  m <- 1:nr - b + 1
  n <- (1:nr)[m>0]

  for(i in n)
    out[i] <- max(a[m[i]:i])
})
## user  system elapsed 
## 0.39    0.00    0.39 
Run Code Online (Sandbox Code Playgroud)