首先我要说的是,这是我在堆栈溢出时发布的第一个问题.如果我需要在我的问题中更改样式,格式等,请告诉我.
我想对两个数据表执行左外连接操作,其中一个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
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以保留合并命令与数据帧的灵活性.使用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[...].
| 归档时间: |
|
| 查看次数: |
2548 次 |
| 最近记录: |