9

我需要计算向量子集的均值和方差。设x为向量,并y作为观察值是否在子集中的指标。哪个更有效:

sub.mean <- mean(x[y])
sub.var  <-  var(x[y])

或者

sub      <- x[y]
sub.mean <- mean(sub)
sub.var  <-  var(sub)
sub      <- NULL

第一种方法不会显式创建新对象。但是是否隐式调用mean并执行此操作?var或者他们是否在存储的原始向量上工作?

第二个更快是因为它不必进行两次子集化吗?

我关心大型数据集的速度和内存管理。

4

1 回答 1

7

对长度为 10M 的向量进行基准测试表明(在我的机器上)后一种方法更快:

f1 = function(x, y) {
    sub.mean <- mean(x[y])
    sub.var  <-  var(x[y])
}

f2 = function(x, y) {
    sub      <- x[y]
    sub.mean <- mean(sub)
    sub.var  <-  var(sub)
    sub      <- NULL
}

x = rnorm(10000000)
y = rbinom(10000000, 1, .5)

print(system.time(f1(x, y)))
#   user  system elapsed 
#  0.403   0.037   0.440 
print(system.time(f2(x, y)))
#   user  system elapsed 
#  0.233   0.002   0.235 

这并不奇怪——必须为函数创建一个新对象mean(x[y]) 才能mean起作用,即使它没有将其添加到本地命名空间。因此,f1必须进行两次子集化(正如您所猜测的那样)会更慢。

于 2013-02-26T16:09:51.233 回答