1

如果一个函数返回 2 个或更多值,并且使用fill = NArollapply会变得慢得多。有什么办法可以避免吗?

f1= function(v)c(mean(v)+ median(v))    #return vector of length 1
f2= function(v)c(mean(v), median(v))    #return vector of length 2


v = rnorm(1000)
microbenchmark(rollapplyr(v, 20, f1), rollapplyr(v,20, f1, fill=NA) )

#                             expr      min       lq     mean   median       uq      max neval
#            rollapplyr(v, 20, f1) 50.84485 53.68726 57.21892 54.63793 57.78519 75.88305   100
# rollapplyr(v, 20, f1, fill = NA) 52.11355 54.69866 59.73473 56.20600 63.10546 99.96493   100

microbenchmark(rollapplyr(v, 20, f2), rollapplyr(v,20, f2, fill=NA) )

#                             expr      min       lq     mean   median       uq      max neval
#            rollapplyr(v, 20, f2) 51.77687 52.29403 56.80307 53.44605 56.65524 105.6713   100
# rollapplyr(v, 20, f2, fill = NA) 69.93853 71.08953 76.48056 72.21896 80.58282 151.4455   100
4

1 回答 1

4

原因在于使用fill.na不同类型数据的速度,就像函数内部发生的那样rollapply()。您f1返回一个向量,而f2返回一个由两列组成的矩阵(好吧,zoo实际上两者都是对象,但您明白我的意思)。

插入 NA 的速度降低与元素数量的增加不成比例,如下所示:

library(zoo)
library(microbenchmark)

v <- zoo(rnorm(1000))
m <- zoo(matrix(rnorm(2000), ncol=2))
ix <- seq(1000)>50
microbenchmark(na.fill(v, NA, ix), na.fill(m, NA, ix))

# Unit: microseconds
#               expr      min        lq       mean    median         uq      max neval
# na.fill(v, NA, ix)  402.861   511.912   679.1114   659.597   754.8385  4716.46   100
# na.fill(m, NA, ix) 9746.643 10091.038 14281.5598 14057.304 17589.9670 22249.96   100
于 2017-01-19T09:59:02.703 回答