我有两个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中有很多列,所以我不想逐一更改它们。有没有有效的方法来做到这一点?
答案 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
软件包维护者计划在连接上写一个小插图。