当前位置:  开发笔记 > 数据库 > 正文

左外连接data.table,具有不同的关键变量名称

如何解决《左外连接data.table,具有不同的关键变量名称》经验,为你挑选了1个好方法。

首先我要说的是,这是我在堆栈溢出时发布的第一个问题.如果我需要在我的问题中更改样式,格式等,请告诉我.

我想对两个数据表执行左外连接操作,其中一个exra条件允许我对两个数据表中的关键变量使用不同的名称.例:

DT1 = data.table(x1=c("b","c", "a", "b", "a", "b"),   x2a=1:6,m1=seq(10,60,by=10))
setkey(DT1,x1,x2a)
> DT1
   x1 x2a m1
1:  a   3 30
2:  a   5 50
3:  b   1 10
4:  b   4 40
5:  b   6 60
6:  c   2 20
DT2 = data.table(x1=c("b","d", "c", "b","a","a"),x2b=c(1,4,7,6," "," "),m2=5:10)
setkey(DT2,x1,x2b)
> DT2
   x1 x2b m2
1:  a      9
2:  a     10
3:  b   1  5
4:  b   6  8
5:  c   7  7
6:  d   4  6
############# first, I use the merge operation on the data frames to do a left outer join
dfL<-merge.data.frame(DT1,DT2,by.x=c('x1','x2a'),by.y=c('x1','x2b'),all.x=TRUE)
> dfL
  x1 x2a m1 m2
1  a   3 30 NA
2  a   5 50 NA
3  b   1 10  5
4  b   4 40 NA
5  b   6 60  8
6  c   2 20 NA
################# attempt with data table left outer join 
> dtL<-DT2[DT1,on=c("x1","x2a")]
Error in forderv(x, by = rightcols) : 
  'by' value -2147483648 out of range [1,3]

#################### code that works with data table
DT1 = data.table(x1=c("b","c", "a", "b", "a", "b"), x2=as.character(1:6),m1=seq(10,60,by=10))
setkey(DT1,x1,x2)
DT1
DT2 = data.table(x1=c("b","d", "c", "b","a","a"),x2=c(1,4,7,6," "," ") ,m2=5:10)
setkey(DT2,x1,x2)
DT2
dtL<-DT2[DT1]
######################## this required identical naming of the key variables in the two data tables
################### Also does not allow a ad-hoc selection of the key variables with the "on" argument

我想知道是否可以保留合并命令与数据帧的灵活性.使用data.table.



1> Matt Dowle..:

从v1.9.6开始(2015年9月CRAN):

X[Y]语法现在可以加入而无需使用新on参数设置键.例如:DT1[DT2, on=c(x = "y")]将"y" DT2与"x"的列连接起来DT1.DT1[DT2, on="y"]将加入两个data.tables的列"y".

请在README中搜索字符串"on =",以on=获取与开发中v1.9.7 相关的更多项目.您要求左外连接,这是默认X[Y]语法(X[Y,nomatch=0]切换到内连接).

但请注意,如果您可以支付前期成本setkey(在data.table中相当快),设置密钥总是会更快到后续加入.该概念类似于SQL中的聚簇索引.

X[Y]语法vs 的优点merge()是您可以包含jby在同一[...]查询中.优化了这样的查询,因此只j连接表达式所需的列,从而节省了时间和RAM.见FAQ 1.12.by=.EACHI也是一个强大的X[Y]语法功能,你没有得到,merge()目前data.table独有.您可以on=与查询by=.EACHI内部一起使用DT[...].

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有