根据列名合并data.tables

时间:2012-12-28 12:47:01

标签: r data.table

我正在尝试与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

我很高兴使用[data.table:::merge,但我想要一个不修改DTDT1的选项(比如更改列名和调用合并)并改回来)

3 个答案:

答案 0 :(得分:8)

更新:自 data.table v1.9.6(2015年9月19日发布)以来,merge.data.table()接受并很好地处理参数by.x=by.y=Here's an updated link到下面引用的FR(现已结束)。


是的,这是尚未实施的功能请求:

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

没有任何阻止它的东西。只是未完成的事情。我很少需要merge并且很难更普遍地意识到它的用处。我们在merge性能最快X[Y]时取得了良好的进展,此功能请求具有最高优先级。如果您更喜欢它,我们非常欢迎您将这些参数添加到merge.data.table并自行提交更改。我们尝试在一个函数/文件中保持源代码简短,所以通过查看merge.data.table源代码,希望您可以关注它,看看需要做什么。

答案 1 :(得分:5)

现在,by.x的开发版本中提供了参数by.ydata.table。见here。使用devtools::install_github("Rdatatable/data.table", build_vignettes = FALSE)安装data.table的开发版本。

答案 2 :(得分: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

进行EDIT更新

您应该设置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")