Объединение данных. таблицы на основе имен столбцов
Я пытаюсь сделать некоторые объединения с левым соединением с 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
(например, изменение имен столбцов и вызов слияния и их изменение)
Ответы
Ответ 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")