R:合并data.table并填写NA

时间:2013-11-11 04:40:50

标签: r merge 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)

我想将它们合并到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

有没有办法让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

2 个答案:

答案 0 :(得分:7)

如果您事先知道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

这会显示data.table的复合查询(即dt1[dt2[dt3[...]]]),这些查询是邪恶的!

如果您事先不知道关键列的唯一值,则可以列出表格并使用lapply快速浏览它们,获取唯一值以使您的{{1表达式......

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"

答案 1 :(得分:6)

在探索all的{​​{1}}参数时,我还会为您提供一个可能需要考虑的替代方案:

merge