2014-12-23 5 views
3

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

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

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

  1. https://www.youtube.com/watch?v=1uVWjdAbgBg
  2. https://stackoverflow.com/a/13686768/3892933
  3. Joining tables with identical (non-keyed) column names in R data.table
  4. https://github.com/gjreda/pydata2014nyc
+0

Vijay, обе функции реализованы в 1.9.5. Пожалуйста, сообщите нам на странице github, если у вас есть другие предложения по улучшению. Благодарю. – Arun

+0

Спасибо, Арун. Теперь data.table ведет себя как обычный data.frame. Теперь я могу использовать data.table еще чаще! – Vijay

+1

Возможный дубликат [слияния таблиц с разными именами столбцов] (http://stackoverflow.com/questions/16047253/merging-tables-with-different-column-names) –

ответ

6

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


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

  • merge.data.table набирает by.x и by.y аргументы

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

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

+0

Спасибо @Arun. Мне нравятся аргументы 'by.x' и' by.y'. Я совсем не жалуюсь. Мне очень нравится data.table и хочу, чтобы это получилось. Я изучаю внутренности/код data.table, и я постараюсь внести свой вклад, как только смогу. – Vijay

+0

@Vijay, не беспокойтесь. Не думал, что ты был. Рад, что вы изучаете внутренности. Вы можете написать мне (и/или Мэтту), если у вас есть вопросы/трудности (см. Страницу проекта github). Удачи :-). – Arun

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") 
+0

Ваши советы звучат, MrFlick, и я знаю, что ключи не обязательно должны быть одинаковыми. Для меня это вовсе не проблема, но я нахожу это докучливым и, возможно, склонным к ошибкам, для кого-то (скорее всего, моих учеников), не заботясь (осознавая?) Этой проблемы. Что касается преобразования в базовый data.frame, разве это не победит всю цель использования data.table в первую очередь? – Vijay

+0

Да, это победит цель, но так будет соединяться с неядерными (проиндексированными) столбцами. Таким образом, вам лучше всего просто убедиться, что ваши таблицы правильно введены. – MrFlick

0

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

Смежные вопросы