在R

时间:2016-10-11 20:23:04

标签: r data.table

我有两个data.table。

dt1 <- data.table(id=seq(1, 4), col1=1:4, col2=1:4, col3=1:4)
dt2 <- data.table(id=seq(1, 5), val=c("a", "b", "c", "d", "e"))

我想做一个正确的加入,比如

dt <- merge(dt1, dt2, all.y=TRUE, by="id")

但是将结果中的NAs替换为0。 结果应该是

id  col1    col2    col3    val
1   1   1   1   a
2   2   2   2   b
3   3   3   3   c
4   4   4   4   d
5   0   0   0   e 

我在data.table中有很多列,所以我不想逐一更改它们。有没有有效的方法来做到这一点?

1 个答案:

答案 0 :(得分:3)

您可以考虑将dt1的cols添加到dt2,而不是创建新表:

cols = setdiff(names(dt1), "id")
dt2[dt1, on="id", (cols) := mget(paste0("i.", cols))]
dt2[!dt1, on="id", (cols) := 0 ]

   id val col1 col2 col3
1:  1   a    1    1    1
2:  2   b    2    2    2
3:  3   c    3    3    3
4:  4   d    4    4    4
5:  5   e    0    0    0

如果你真的想要一张新桌子,你可以做到

cols = setdiff(names(dt1), "id")
z = dt1[dt2, on="id"]
z[!dt1, on="id", (cols) := 0 ]

   id col1 col2 col3 val
1:  1    1    1    1   a
2:  2    2    2    2   b
3:  3    3    3    3   c
4:  4    4    4    4   d
5:  5    0    0    0   e

软件包维护者计划在连接上写一个小插图。