слияние data.tables на основе названий колонок

Я пытаюсь сделать некоторые слияния лево-соединения с data.tables. Цитата описания пакета это

Во всех соединениях названия колонок не важны; к колонкам ключа x присоединяются в заказе

I understand that I can use .data.table[ and data.table:::merge.data.table

What I would like is : merge X and Y specifying the keys (like by.x and by.y in base merge, ->why taking this away ?)

Давайте предположим, что я имею

DT = data.table(x=rep(c("a","b","c"),each=3),y=c(1,3,6),v=1:9,key="x,y,v")
DT1 = data.frame(x1=c("aa","bb","cc"),y1=c(1,3,6),v1=1:3,key="x1,y1,v1")

и я хотел бы эту продукцию:

#data.table:::merge is masking I don't know how to call the base version of merge anymore
R) {base::merge}(DT,DT1,by.x="y",by.y="y1") 
y x v x1 v1
1 1 a 1 aa  1
2 1 c 7 aa  1
3 1 b 4 aa  1
4 3 a 2 bb  2
5 3 b 5 bb  2
6 3 c 8 bb  2
7 6 b 6 cc  3
8 6 a 3 cc  3
9 6 c 9 cc  3

Я очень рад использовать [ или data.table::: слияние , но я хотел бы выбор, которые не изменяют DT или DT1 (как изменение имен столбцов и запрос слияния и изменение его назад)

13
nl ja de
добавлено автор statquant, источник
merge.data.table является методом для универсальной основной функции S3 слияние . Назвать основное слияние, merge.data.frame (DT, DT1, by.x = "y", by.y = "y1") должно работать. Но см. мой ответ также.
добавлено автор Matt Dowle, источник
Btw, я просто заметил ваши две попытки отправить к помощи таблицы данных от Нэббла. Они haven' t пройденный (см. желтую полосу наверху в Нэббле), потому что необходимо подписаться на помощь таблицы данных сначала. Нэббл просит, чтобы вы "были вами член списка you' ре, пытающееся отправить к" при регистрации. It' s легкий и автоматический, чтобы присоединиться. It' s просто мера по предотвращению спама.
добавлено автор Matt Dowle, источник
Я знаю, что это старо, но shouldn' t это быть возможным обойти это, переименовывая одну из колонок в data.table, чтобы соответствовать другому data.table? I' ve попробовал это использование setnames и придумал ошибку, но меня don' t видят почему это shouldn' t работа.
добавлено автор willwest, источник

3 ответы

Update: Since data.table v1.9.6 (released September 19, 2015), merge.data.table() does accept and nicely handles arguments by.x= and by.y=. Here's an updated link to the FR (now closed) referenced below.


Да это - запрос новых функций, еще не осуществленный:

FR#2033 Add by.x and by.y to merge.data.table

Нет ничего предотвращающего его. Просто что-то, что не было сделано. Я очень редко должен слияние , и не спешил понимать его полноценность более широко. Мы быстро поправились в подаче слияния работа с такой скоростью, как X [Y] , и этот запрос новых функций в самом высоком приоритете. Если вы хотели бы его более быстро, вы - больше, чем приветствие, чтобы добавить те аргументы, чтобы merge.data.table и передать изменение сами. Мы пытаемся сохранять исходный код коротким и вместе в одной функции/файле, таким образом, смотря merge.data.table источник, надо надеяться, можно следовать за ним и видеть что потребности быть сделанными.

8
добавлено
Я могу попытаться взглянуть (Это, вероятно, выше моего уровня, хотя), я должен был бы настроить svn/git, хотя я предполагаю...
добавлено автор statquant, источник
Я должен повторно отправить это хотя или нет?
добавлено автор statquant, источник
Да я думаю, что есть проблема в левом внешнем объединении, соответствие, кажется, сделано неправильно, поскольку на lign 1 depID=NA получает depNane=Eng, и на lign2 name=Raf освобождает it' s depName (=NA вместо Сэла).
добавлено автор statquant, источник
можете вы прочитать сообщение ревете, потому что я боюсь ошибки в Y [X] самом (или особенность), но если вы смотрите на левый рев внешнего объединения Y [X] выставочный вереск, это не должно: ((Я надеюсь, что я неправ),
добавлено автор statquant, источник
Я сомневаюсь относительно it' s очень вне вашего уровня, источник слияния просто R и X [Y] требования, которые вы уже узнаете. Это могло бы быть хорошее осуществление, чтобы собрать на самом деле. Если бы data.table был на GitHub, то это было бы легче для вас?
добавлено автор Matt Dowle, источник
@statquant ой, проигнорируйте предыдущий длинный комментарий. Я didn' t смотрят достаточно тесно. Это кажется соответствию неправильно doesn' t это. Хуже, чем я думал. Будет смотреть...
добавлено автор Matt Dowle, источник
@statquant Да, пожалуйста. Тогда это может быть связано с другим NA в ключевых вопросах, связанных с отчетом об ошибках и т.д. It' s довольно отличный от этого вопроса.
добавлено автор Matt Dowle, источник

Аргументы by.x и by.y теперь доступны в версии развития data.table . Посмотрите здесь. Используйте devtools:: install_github ("Rdatatable/data.table", build_vignettes = ЛОЖНЫЙ) , чтобы установить версию развития data.table .

5
добавлено
Это - теперь версия 1.9.6
добавлено автор Ben, источник
Спасибо за полезный PR.
добавлено автор David Arenburg, источник
Хороший, чтобы знать, Спасибо!
добавлено автор Veerendra Gadekar, источник

Вы не можете, потому что колонками должен быть на пересечении colnames (DT) и colnames (DT1)

 if (!all(by %in% intersect(colnames(x), colnames(y)))) {
       stop("Elements listed in `by` must be valid column names in x and y")
   }

Здесь используя setnames, который, который не копирует и очень быстр

setnames(DT1,'y1','y')
> merge(DT,DT1)
   y x v x1 v1
1: 1 a 1 aa  1
2: 1 b 4 aa  1
3: 1 c 7 aa  1
4: 3 a 2 bb  2
5: 3 b 5 bb  2
6: 3 c 8 bb  2
7: 6 a 3 cc  3
8: 6 b 6 cc  3
9: 6 c 9 cc  3

ОТРЕДАКТИРУЙТЕ обновление с data.table версией data.table 1.9.4

необходимо установить параметр иначе, вы получаете ошибку:

Error in merge.data.table(DT, as.data.table(DT1)) : 
  Elements listed in `by` must be valid column names in x and y

Необходимо сделать что-то как:

merge(DT,DT1,by="y")
4
добавлено
@statquant я должен заняться расследованиями для ' [' решение. Я еще не data.table пользователь.. Ваш хотеть ' [' потому что это более изящно?
добавлено автор agstudy, источник
@matthew я смотрю на слияния, я думаю, что нашел ошибку (может быть особенность), поскольку merge.data.table и merge.data.frame не производят те же самые результаты для внешних левых и правых соединений
добавлено автор statquant, источник
На самом деле [ быстрее, чем слияние как поиск слияния оба X и Y . data.table не очень четкий с материалом слияния, это испытывает недостаток в хорошем слиянии часто задаваемых вопросов.
добавлено автор statquant, источник
Да, но тогда я должен задержать имена столбцов... Есть ли способ сделать его с [, поскольку мне, возможно, понадобилось бы nomatch выбор?
добавлено автор statquant, источник
Согласованный @statquant, data.table пропускает много вещей: 104 запроса новых функций, выдающиеся, например. Хотя, многие из тех - действительно пункты TODO, чем особенности по сути.
добавлено автор Matt Dowle, источник
Хороший @statquant, будет смотреть. Электронная почта к помощи таблицы данных, спрашивающей, если it' s ошибка лучший курс, если это возможно. Вопросами на S.O., как предполагается, не является ' характерный для пункта в time' - that' s одна из причин закрыть вопрос. IIUC ТАК этикет. Но лично я don' t возражают против любого метода, просто благодарный за отчет об ошибках главное.
добавлено автор Matt Dowle, источник