2014-09-01 57 views
7

一個data.table時的例子是在這裏:如何加入多列和多值

DT = data.table(x=1:4, y=6:9, z=3:6) 
setkey(DT, x, y) 

聯接列有多個值:

xc = c(1, 2, 4) 
yc = c(6, 9) 
DT[J(xc, yc), nomatch=0] 
    x y z 
1: 1 6 3 

此使用的J()只返回單列。實際上,我想作爲%in%運營商加入。

DT[x %in% xc & y %in% yc] 
    x y z 
1: 1 6 3 
2: 4 9 6 

但使用%in%操作使得搜索矢量掃描相比,二進制搜索,這是非常緩慢的。爲了有二進制搜索,我建立連接值的每一個可能的組合:

xc2 = rep(xc, length(yc)) 
yc2 = unlist(lapply(yc, rep, length(xc))) 
DT[J(xc2, yc2), nomatch=0] 
    x y z 
1: 1 6 3 
2: 4 9 6 

但建築XC2,YC2以這種方式使得代碼難以閱讀。在這種情況下是否有更好的方法來提高二分法搜索的速度以及%in%算子的簡單性?

+11

我認爲你正在尋找* cross join * - 這是函數'CJ'。試試'DT [CJ(xc,yc),nomatch = 0L]'。隨意發佈這個答案(如果正確)並接受它。 – Arun 2014-09-01 15:46:24

回答

1

回答從DT標籤中刪除這個問題打開問題。
代碼來自Arun的評論DT[CJ(xc,yc), nomatch=0L]將完成這項工作。