Подтвердить что ты не робот

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

Я пытаюсь сделать некоторые объединения с левым соединением с data.tables. Описание описания пакета, которое

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

Я понимаю, что могу использовать .data.table[ и data.table:::merge.data.table

Я бы хотел: merge X и Y, определяющие ключи (например, by.x и by.y в слиянии базы, → зачем это убирать?)

Предположим, что

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:::merge, но мне нужна опция, которая не изменяет DT или DT1 (например, изменение имен столбцов и вызов слияния и их изменение)

4b9b3361

Ответ 1

Обновление: Поскольку data.table v1.9.6 (выпущен 19 сентября 2015 г.), merge.data.table() принимает и красиво обрабатывает аргументы by.x= и by.y=, Здесь обновленная ссылка в FR (теперь закрыта), на которую ссылается ниже.


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

FR # 2033 Добавьте by.x и by.y в файл merge.data.table

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

Ответ 2

Аргументы by.x и by.y теперь доступны в версии разработки data.table. См. здесь. Используйте devtools::install_github("Rdatatable/data.table", build_vignettes = FALSE) для установки версии разработки data.table.

Ответ 3

Вы не можете, потому что столбцы by должны находиться в пересечении имен (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

Обновление EDIT с данными .table version.table 1.9.4

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

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