Объединение таблиц с разными именами столбцов
Если я правильно понял, по умолчанию 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]
См. историю для более старых версий.