14

我正在尝试与 data.tables 进行一些左连接合并。包描述引用

在所有连接中,列的名称是不相关的;x的键的列按顺序连接

我知道我可以使用.data.table[并且data.table:::merge.data.table

我想要的是:合并 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

我很高兴使用[ordata.table:::merge但我想要一个不修改DTor的选项DT1(例如更改列名并调用合并并将其改回)

4

3 回答 3

9

更新:data.table v1.9.6(2015 年 9 月 19 日发布)以来,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希望通过查看源代码,您可以关注它并了解需要做什么。

于 2012-12-28T16:18:45.553 回答
5

参数by.xby.y现在在data.table. 见这里。用于devtools::install_github("Rdatatable/data.table", build_vignettes = FALSE)安装data.table.

于 2015-05-30T06:23:34.940 回答
4

你不能因为 by 列必须在 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 编辑更新

你应该设置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")
于 2012-12-28T13:19:08.443 回答