【问题标题】:R: Merge data.table and fill in NAsR:合并data.table并填写NA
【发布时间】:2013-11-11 04:40:49
【问题描述】:

假设有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

【问题讨论】:

  • 查看merge 的帮助条目。有一个参数叫做all
  • +1 用于简短的独立可重现示例,具有所需的结果和您尝试做的事情。这是如何纠正问题的一个很好的例子,我很惊讶它没有得到更多的支持。
  • @SimonO101,出于同样的原因,我给了它一个 +1。我很惊讶那里实际上有反对票。
  • @AnandaMahto 我没有注意到这一点。太令人失望了。

标签: r merge data.table


【解决方案1】:

当您探索 mergeall 参数时,我还将为您提供一个可能需要考虑的替代方案:

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

【讨论】:

  • 有趣。我是否正确地说它也更快,因为它在帮助“当前实现是非递归的,以确保稳定性和可扩展性。”中所说的那样?
  • Reduce data.table?这是data.tabley 的做事方式吗?
  • 虽然我有data.table的徽章,但我承认根本不知道“路”。 :-(
  • 哈。我要徽章!。自己+1(尽管我仍然不相信在这里使用Reduce 的效用 - 说真的,我是真的在问这个问题,所以如果有人能启发我,我想知道)。
【解决方案2】:

如果您事先知道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 快速遍历它们,获取唯一值以使您的 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"

然后像以前一样使用它,即dt1[ dt2[ dt3[ J( vals ) , ] ] ]

【讨论】:

  • 好的,好的。有一个 +1 :-)
猜你喜欢
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多