到目前为止,我在函数内部使用循环的方式如下:
# x is a vector of numbers
# [1] 0 1 -1 -5 100 20 15
function(x,n){
results <- numeric(length(x)-n+1)
for(i in 1:(length(x)+1-n)){
results[i] <- min(x[i:(i+n-1)])
}
return(results)
}
## outputs this for x and n = 3
# [1] -1 -5 -5 -5 15
我想知道是否有更高效的解决方案,可能不需要循环。
编辑:
我对一个包含6019个观测值的向量运行了两个解决方案的微基准测试。等我有时间(或者知道如何做),我可以尝试使用不同的观测值大小来测试每个解决方案的有效性。但现在:
Rcpp 解决方案:
> microbenchmark(nmin(x,3))
Unit: microseconds
expr min lq mean median uq max neval
nmin(x, 3) 53.885 54.313 57.01953 54.7405 56.023 93.656 100
caTools解决方案:
microbenchmark(runmin(x[[1]],3,endrule='trim'))
Unit: microseconds
expr min lq mean median uq max neval
runmin(x[[1]], 3, endrule = "trim") 231.788 241.8385 262.6348 249.964 262.5795 833.923 100
动物园方案:
> microbenchmark(rollapply(x[[1]],3,min))
Unit: milliseconds
expr min lq mean median uq max neval
rollapply(x[[1]], 3, min) 42.2123 47.2926 50.40772 50.33941 52.50033 98.46828 100
我的解决方案:
> microbenchmark(nDayLow(x[[1]],3))
Unit: milliseconds
expr min lq mean median uq max neval
nDayLow(x[[1]], 3) 13.64597 14.51581 15.67343 15.33006 15.71324 63.68687 100
Rcpp
的解决方案吗? - Simon O'Hanlon