Я пытаюсь понять логику в data.table
из документации и немного неясно. Я знаю, что могу просто попробовать это и посмотреть, что произойдет, но я хотел бы убедиться, что нет патологического случая, и поэтому хотел бы знать, как была закодирована логика. Когда два объекта data.table
имеют различное количество столбцов ключа, например a
имеет 2 и b
имеет 3, и вы запускаете c <- a[b]
, будут a
и b
объединены просто на первых двух ключевые столбцы или будет ли третий столбец в автоматически объединен с третьим столбцом ключа в b
? Пример:
require(data.table)
a <- data.table(id=1:10, t=1:20, v=1:40, key=c("id", "t"))
b <- data.table(id=1:10, v2=1:20, key="id")
c <- a[b]
Это должно выбрать строки a
, соответствующие столбцу id
в b
. Например, для id==1
в b
в b
есть 2 строки и 4 строки в a
, которые должны генерировать 8 строк в c
. Это действительно то, что кажется:
> head(c,10)
id t v v2
1: 1 1 1 1
2: 1 1 21 1
3: 1 11 11 1
4: 1 11 31 1
5: 1 1 1 11
6: 1 1 21 11
7: 1 11 11 11
8: 1 11 31 11
9: 2 2 2 2
10: 2 2 22 2
Другой способ попробовать:
d <-b[a]
Это должно сделать то же самое: для каждой строки в a
она должна выбрать соответствующую строку в b
: поскольку a
имеет дополнительный ключевой столбец, t
, этот столбец не должен использоваться для сопоставления и соединение должно основываться только на первом ключевом столбце, id
должно быть выполнено. Похоже, что это так:
> head(d,10)
id v2 t v
1: 1 1 1 1
2: 1 11 1 1
3: 1 1 1 21
4: 1 11 1 21
5: 1 1 11 11
6: 1 11 11 11
7: 1 1 11 31
8: 1 11 11 31
9: 2 2 2 2
10: 2 12 2 2
Может кто-нибудь подтвердить? Чтобы быть ясным: это третий ключевой столбец a
, когда-либо используемый в любом из слияний, или data.table
использует только min(length(key(DT)))
для двух таблиц.