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

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

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

  1. https://www.youtube.com/watch?v=1uVWjdAbgBg
  2. https://stackoverflow.com/a/13686768/3892933
  3. Объединение таблиц с идентичными (без ключа) именами столбцов в R data.table
  4. https://github.com/gjreda/pydata2014nyc
3
Vijay 23 Дек 2014 в 04:22
Виджай, обе функции реализованы в версии 1.9.5. Пожалуйста, сообщите нам на странице github, если у вас есть другие предложения по улучшению. Спасибо.
 – 
Arun
13 Авг 2015 в 23:41
Спасибо, Арун. Теперь data.table ведет себя как обычный data.frame. Теперь я могу использовать data.table еще чаще!
 – 
Vijay
19 Авг 2015 в 08:35
1
 – 
rafa.pereira
22 Окт 2015 в 16:44

3 ответа

Лучший ответ

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


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

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

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

Самая простая причина в том, что мы еще не дошли до него.

6
Arun 7 Апр 2016 в 14:46
Спасибо @Арун. Мне нравятся аргументы by.x и by.y. Я вовсе не жалуюсь. Мне очень нравится data.table и я хочу, чтобы он преуспел. Я изучаю внутренности/код data.table и постараюсь внести свой вклад, как только смогу.
 – 
Vijay
23 Дек 2014 в 17:19
@ Виджай, не беспокойся. Не думал, что ты такой. Рад, что вы изучаете внутренности. Вы можете написать мне (и/или Мэтту), если у вас есть вопросы/трудности (см. страницу проекта на github). Удачи :-).
 – 
Arun
23 Дек 2014 в 17:40

Обычно при объединении 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")
2
MrFlick 23 Дек 2014 в 04:29
Ваш совет разумен, мистер Флик, и я знаю, что ключи не обязательно должны быть одинаковыми. Для меня это совсем не проблема, но я нахожу это утомительным и, возможно, подверженным ошибкам для кого-то (скорее всего, моих учеников), не внимающего (осведомленного?) об этом вопросе. Что касается преобразования в базовый data.frame, не будет ли это поражением всей цели использования data.table в первую очередь?
 – 
Vijay
23 Дек 2014 в 05:00
Да, это нанесет ущерб цели, но то же самое произойдет и с объединением неключевых (индексированных) столбцов. Поэтому вам лучше всего просто убедиться, что ваши таблицы правильно набраны.
 – 
MrFlick
23 Дек 2014 в 05:06

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

0
victor_v 17 Окт 2017 в 11:39