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

Я смотрел видео [1] Грега Реды о Pandas, чтобы увидеть, что Pandas может делать, как он сравнивается с data.table. Я был удивлен, узнав, как сложно объединить таблицы в data.table. Если вы смотрите видеоролик, в частности, с 49:00 до 52:00, вы увидите, что Pandas позволяет присоединяться к таблицам на основе разных имен столбцов, и вы можете выбрать различные суффиксы для левой и правой таблиц. Я понимаю, что setkey используется для оптимизационных целей [2] и понимает, как объединить таблицы, используя одинаковые имена столбцов [3]. Я попробовал слияние данных. Table, но с большим трудом установил параметр ключевого слова by=, используя разные имена столбцов. Итак, вот мои вопросы.

Возможно ли, в data.table, объединить таблицы на основе разных имен столбцов? Если да, то как? Если нет, почему бы и нет? Кроме того, более полезно, не будет ли эта функция полезна? Удивительно, что этот вопрос не появился раньше. Простите меня (и, пожалуйста, укажите мне их), если это было обсуждено ранее.

Кстати, данные, о которых говорит Грег, найдены на его github [4].

Ответ 1

Обновление: Все перечисленные ниже функции реализованы и доступны в текущей стабильной версии data.table v1.9.6 в CRAN.


Есть, по крайней мере, такие улучшения, которые возможны для объединений в data.tables.

  • merge.data.table получение by.x и by.y аргументов

  • Использование вторичных ключей для соединения с использованием обеих форм, описанных выше, без необходимости устанавливать ключи, а вместо указания столбцов на x и i.

Простейшая причина в том, что нам еще не удалось добраться до нее.

Ответ 2

Обычно, при подключении data.tables имена столбцов на самом деле не имеют значения. Вам просто нужно убедиться, что обе таблицы имеют совместимый ключ.

library(data.table)
dt1<-data.table(a=letters[1:10], b=1:10)
setkey(dt1,a)
dt2<-data.table(x=letters[1:10], y=10:1)
setkey(dt2,x)

dt1[dt2]

В основном он будет объединяться во всех ключевых столбцах. Обычно вы присоединяетесь к ключу. Если вам действительно нужно указать неключевые столбцы, вы всегда можете отнести data.table к файлу data.frame и использовать стандартную функцию merge()

merge(as.data.frame(dt1),dt2, by.x="a", by.y="x")
merge(as.data.frame(dt1),dt2, by.x="b", by.y="y")

Ответ 3

Что касается страницы Rdatatable github, если вы хотите выполнять функции на вашем объединении, а не просто слияния таблиц, вы можете также d1[d2, somefunc, on = "A==W"], где A - ваш столбец в d1, а W - ваш столбец в d2.