首先我要说的是,这是我在堆栈溢出时发布的第一个问题.如果我需要在我的问题中更改样式,格式等,请告诉我.
我想对两个数据表执行左外连接操作,其中一个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.
从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()
是您可以包含j
并by
在同一[...]
查询中.优化了这样的查询,因此只j
连接表达式所需的列,从而节省了时间和RAM.见FAQ 1.12.by=.EACHI
也是一个强大的X[Y]
语法功能,你没有得到,merge()
目前data.table独有.您可以on=
与查询by=.EACHI
内部一起使用DT[...]
.