这来自 data.table 介绍中的示例。见 http://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.pdf
示例继续说明二进制搜索比矢量扫描更快并且产生完全相同的结果(参见第 5 页)。所以这是我的例子:
library(data.table)
grpsize = ceiling(10000/26^2)
DF <- data.frame(x=rep(LETTERS,each=26*grpsize), y=rep(letters,each=grpsize),v=runif(grpsize*26^2), stringsAsFactors=FALSE)
DT = data.table(DF)
setkey(DT,x,y)
DT[x=='R' & y=='h']
DT[J("R","h")]
正如预期的那样,这将返回完全相同的结果。一个扫描每一行,另一个是二进制搜索。但是,当存在不存在的行时,结果会有所不同。请参阅以下代码:
DT[x=='R' & y=='H']
DT[J("R","H")]
我得到以下结果
# > DT[x=='R' & y=='H', ]
# Empty data.table (0 rows) of 3 cols: x,y,v
# > DT[J("R","H")]
# x y v
# 1: R H NA
a.) 为什么会这样?
b.) 有没有办法改变二分搜索的行为以不返回不存在行的结果?