Wet*_*eet 5 merge r data.table
假设有3个数据表:
dt1<-data.table(Type=c("a","b"),x=1:2)
dt2<-data.table(Type=c("a","b"),y=3:4)
dt3<-data.table(Type=c("c","d"),z=3:4)
Run Code Online (Sandbox Code Playgroud)
我想将它们合并到1个数据表中,所以我这样做:
dt4<-merge(dt1,dt2,by="Type") # No error, produces what I want
dt5<-merge(dt4,dt3,by="Type") # Produces empty data.table (0 rows) of 4 cols: Type,x,y,z
Run Code Online (Sandbox Code Playgroud)
有没有办法让dt5代替这样?:
> dt5
Type x y z
1: a 1 3 NA
2: b 2 4 NA
3: c NA NA 3
4: d NA NA 4
Run Code Online (Sandbox Code Playgroud)
如果您事先知道列中的唯一值,则Type
可以使用J
,然后按照表的data.table
方式连接表.你应该为每个表设置密钥,以便data.table
知道要加入什么,就像这样......
# setkeys
setkey( dt1 , Type )
setkey( dt2 , Type )
setkey( dt3 , Type )
# Join
dt1[ dt2[ dt3[ J( letters[1:4] ) , ] ] ]
# Type x y z
#1: a 1 3 NA
#2: b 2 4 NA
#3: c NA NA 3
#4: d NA NA 4
Run Code Online (Sandbox Code Playgroud)
这显示了邪恶data.table
的复合查询(即dt1[dt2[dt3[...]]]
)!
如果您事先不知道关键列的唯一值,您可以列出表格并使用lapply
它们快速浏览它们获取唯一值来J
表达您的表达...
# A simple way to get the unique values to make 'J',
# assuming they are in the first column.
ll <- list( dt1 , dt2 , dt3 )
vals <- unique( unlist( lapply( ll , `[` , 1 ) ) )
#[1] "a" "b" "c" "d"
Run Code Online (Sandbox Code Playgroud)
然后像以前一样使用它,即dt1[ dt2[ dt3[ J( vals ) , ] ] ]
.
在您探讨all
争论的同时merge
,我还会为您提供一个可能需要考虑的替代方案:
Reduce(function(x, y) merge(x, y, by = "Type", all = TRUE), list(dt1, dt2, dt3))
# Type x y z
# 1: a 1 3 NA
# 2: b 2 4 NA
# 3: c NA NA 3
# 4: d NA NA 4
Run Code Online (Sandbox Code Playgroud)