2014-09-01 3 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

ответ

1

Ответьте, чтобы удалить этот вопрос из DT-тега, чтобы открыть вопросы.
Код от комментария Аруна DT[CJ(xc,yc), nomatch=0L] выполнит эту работу.

Смежные вопросы