2013-04-26 30 views
6

我有2个数值向量,一个存储值来计算从,滚动窗口的另一长度最大计算滚动的基础上那些最大值。以下是一些示例代码。通常我试图加快system.time内的代码。是否有一些准备好的功能或矢量化的方式来做同样的事情?什么是R上的最快的方法来计算具有可变滚动窗口大小滚动最大?

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 
} 
}) 
+0

+1问得好。这是一个有趣的尝试和优化的问题! – 2013-04-26 13:29:56

回答

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 

略矢量 -

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 
+0

谢谢,现在的代码看起来更好 – user1603038 2013-04-26 12:14:48

+0

+1很好的解决方案 – 2013-04-26 13:29:31

0

您可以vectorise这个问题的部分,尤其是当你需要找出a(我称之为01)的起始索引位置)和窗口(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) 

并以@ e4e5f4的答案比较:

identical(res , out) 
[1] TRUE 

但是它不是相当快:

user system elapsed 
0.46 0.00 0.47 

如果是vectorise的一种方式最后一次手术会很快,但我现在想不出有什么办法可以做到这一点!

相关问题