为什么使用'which()'函数更快?

时间:2017-07-17 04:19:27

标签: r subset which

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()'命令的子集比另一个命令花费更少的时间?

1 个答案:

答案 0 :(得分: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

因此第一个匹配索引行,而第二个计算所有行。

最好,

科林