data.table结果在矢量扫描和二进制搜索之间的差异数据不同

Wol*_* Wu 5 r data.table

这是来自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")]
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,返回完全相同的结果.一个扫描每一行,另一个是二分搜索.但是,当存在不存在的行时,结果会有所不同.请参阅以下代码:

DT[x=='R' & y=='H']
DT[J("R","H")]
Run Code Online (Sandbox Code Playgroud)

我得到以下结果

# > 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
Run Code Online (Sandbox Code Playgroud)

a.)为什么会这样?

b.)是否有办法将二进制搜索的行为更改为不返回非现有行的结果?

Fra*_*ank 10

我猜J不仅仅是二元搜索; 这是一个"加入".对于每个给出的组合键,它必须返回一些东西.要关闭它:

DT[J('R','H'),nomatch=0]
Run Code Online (Sandbox Code Playgroud)