<br />
x = data.frame(matrix(rnorm(2e+7), ncol = 10))<br />
y = paste('x', 1:(2e+6), sep = '.')<br />
rownames(x) = y</p>
<p>idx1 = sort(sample(1:(2e+6), 4e+5))<br />
idx2 = paste('x', idx1, sep = '.')<br />
idx3 = rep(NA, 2e+6)<br />
idx3[idx1] = TRUE<br />
idx3[-idx1] = FALSE</p>
<p>system.time(x[idx1, ])<br />
# 用户 系统 流逝<br />
# 0.210 0.000 0.211<br />
system.time(x[idx2, ])<br />
# 用户 系统 流逝<br />
# 0.580 0.000 0.586<br />
system.time(x[idx3, ])<br />
# 用户 系统 流逝<br />
# 0.636 0.000 0.645<br />
</p>
第一种最快。字符型向量也是用向量保存的,所以相当于找了两次?逻辑型猜测也是转换成数值型再取的。
不过这里一般不会有很明显的性能损失,带逻辑运算的 SELECT 差别却是非常明显,于是出现了 data.table 和 sqldf 这些利用索引提高速度的扩展。