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%
算子的簡單性?
我認爲你正在尋找* cross join * - 這是函數'CJ'。試試'DT [CJ(xc,yc),nomatch = 0L]'。隨意發佈這個答案(如果正確)並接受它。 – Arun 2014-09-01 15:46:24