最有效的向量子集方法



我需要计算向量子集的均值和方差。设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

第一种方法不显式地创建一个新对象;但是对meanvar的调用隐式地做到这一点吗?还是对存储的原始向量起作用?

第二个更快是因为它不需要做两次子集吗?

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

对长度为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因为必须执行两次子集(如您所猜测的)而较慢。

最新更新