Объединение таблиц с разными именами столбцов

Если я правильно понял, по умолчанию data.table объединяет две таблицы, сравнивая столбцы, которые задаются как ключи и имеют одинаковые имена. Как мне писать, если у меня есть таблицы с разными именами столбцов? Например:

set.seed(123)
DT1<-data.table(col1=sample(letters,5,replace=TRUE),col2=sample(LETTERS[1:5],5,replace=TRUE),col3=sample(1:2,5,replace=TRUE))
DT2<-data.table(col4=sample(1:3,10,replace=TRUE),col5=sample(LETTERS[1:5],10,replace=TRUE),col6=sample(1:100,10,replace=TRUE))
(DT1)
(DT2)

> (DT1)
   col1 col2 col3
1:    h    A    2
2:    u    C    1
3:    k    E    2
4:    w    C    2
5:    y    C    1
> (DT2)
    col4 col5 col6
 1:    3    D   48
 2:    1    C   76
 3:    1    C   22
 4:    1    B   32
 5:    3    A   24
 6:    3    E   15
 7:    3    E   42
 8:    2    D   42
 9:    3    D   37
10:    2    A   16

Что мне следует писать в DT1[, чтобы слияние выбирало только строки с col2 == col5 и col3 == col4? Вот ожидаемый результат:

   col1 col2 col3 col4 col5 col6
    h    A    2    2    A   16
    u    C    1    1    C   76
    u    C    1    1    C   22
    y    C    1    1    C   76
    y    C    1    1    C   22

Спасибо заранее!

Ответ 1

Используя соединения на основе набора данных .table подмножество вместе с недавно реализованным аргументом on= и nomatch=0L, это просто:

DT2[DT1, on=c(col5="col2", col4="col3"), nomatch=0L]

Подробнее см. дополнительные индексы для виньетки.


В качестве альтернативы, если у вас есть key.dables.tables, вы можете пропустить аргумент on=. Но вышеприведенное решение было бы идиоматичным, поскольку оно сохраняет порядок исходных данных .tables, и ясно, какие столбцы просматриваются, просматривая код.

setkey(DT1, col2, col3)
setkey(DT2, col5, col4)
DT2[DT1, nomatch=0L]

См. историю для более старых версий.