我正在尝试与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
,但我想要一个不修改DT
或DT1
的选项(比如更改列名和调用合并)并改回来)
答案 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.y
和data.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
您应该设置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")