これは、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")]
予想どおり、これはまったく同じ結果を返します。1 つはすべての行をスキャンし、もう 1 つはバイナリ検索です。ただし、存在しない行がある場合、結果は異なります。次のコードを参照してください。
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.) 二分探索の動作を変更して、存在しない行の結果を返さないようにする方法はありますか?