Пример случай здесь:Как присоединиться к 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