2017-07-17 77 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 

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

最佳,

科林

相關問題