Что означает <объединение в data.table с on = - PullRequest
0 голосов
/ 13 октября 2018

Соединение таблиц данных:

X <- data.table(A = 1:4, B = c(1,1,1,1)) 
#    A B
# 1: 1 1
# 2: 2 1
# 3: 3 1
# 4: 4 1

Y <- data.table(A = 4)
#    A
# 1: 4

через

X[Y, on = .(A == A)]
#    A B
# 1: 4 1

возвращает ожидаемый результат.Однако я ожидаю, что строка:

X[Y, on = .(A < A)]
#    A B
# 1: 4 1
# 2: 4 1
# 3: 4 1

вернет

   A B
1: 1 1
2: 2 1
3: 3 1

, поскольку ключевое слово on:

указывает, какие столбцы в x должныбыть соединенным с какими столбцами в i вместе с типом бинарного оператора для соединения с

в соответствии с ?data.table.Способ соединения не упоминается явно, и, конечно, это не так, как я догадался.Как именно < объединяет столбцы в x со столбцами в i?

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Ты частично прав.Недостающая часть головоломки состоит в том, что (в настоящее время), когда вы выполняете любое объединение, включая неэквивалентное объединение с <, для столбца объединения возвращается один столбец (A в вашем примере).Этот столбец принимает значения из data.table с правой стороны объединения, в этом случае значения из A из Y.

Вот иллюстрированный пример:

Illustration of current non-equi join behaviour

Мы планируем изменить это поведение в будущей версии data.table, чтобы в случае неравных объединений возвращались оба столбца.См. Запросы на получение https://github.com/Rdatatable/data.table/pull/2706 и https://github.com/Rdatatable/data.table/pull/3093.

0 голосов
/ 13 октября 2018

При выполнении неэквивалентного соединения, например X[Y, on = .(A < A)] возвращает столбец A из Y (i -data.table).

Чтобы получить желаемый результат, вы можете сделать:

X[Y, on = .(A < A), .(A = x.A, B)]

, что дает:

   A B
1: 1 1
2: 2 1
3: 3 1

В следующем выпуске вернет оба A столбца. Смотрите здесь для обсуждения .

...