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()'命令的子集比另一个命令花费更少的时间?
答案 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
因此第一个匹配索引行,而第二个计算所有行。
最好,
科林