【发布时间】:2014-11-21 16:11:25
【问题描述】:
到目前为止,我在这样的函数中使用循环:
# 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
【问题讨论】:
-
runmin 似乎给出了迄今为止最快的结果
-
@road_to_quantdom 您没有测试
Rcpp解决方案? -
抱歉耽搁了,我现在才运行解决方案。你的似乎是最有效的!