5

これは、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.) 二分探索の動作を変更して、存在しない行の結果を返さないようにする方法はありますか?

4

1 に答える 1

10

J は単なる二分探索以上のものだと思います。それは「結合」です。与えられたキーの組み合わせごとに、何かを返さなければなりません。オフにするには:

DT[J('R','H'),nomatch=0]
于 2013-08-20T15:56:21.620 に答える