2017-07-17 79 views
0
testdata = round(matrix(runif(1e5),5000,20),1) 

system.time({ 
for (i in 1:1e5) { 
    test1 = testdata[which(testdata[,1] == 0.5),] 
} 
}) 

system.time({ 
for (i in 1:1e5) { 
    test2 = testdata[testdata[,1]==0.5] 
    } 
}) 

当我运行上面的代码时,前者需要约5.0秒,而后者需要约5.9秒。 (在另一种情况下,前者只花费后者的三分之一时间)。为什么使用'which()'函数更快?

为什么通过'which()'命令进行子集化所花费的时间少于另一个?

+4

这种比较是不公平的。第二个是子矩阵的元素,而第一个是子集的行。如果您尝试'test2 = testdata [testdata [,1] == 0.5,]',速度几乎相同。 – mt1022

回答

1

您不是使用相同类型的矢量进行子集化。 which是一个短数字索引,而第二个是TRUE/FALSE的向量。

# Vector of index 
> length(which(testdata[,1] == 0.5)) 
[1] 505 
# Vector of TRUE/FALSE 
> length(testdata[,1]==0.5) 
[1] 5000 

所以第一个匹配索引行,第二个匹配所有行。

最佳,

科林

相关问题