通过引用行为进行的data.table赋值不一致

时间:2014-08-05 17:43:16

标签: r data.table

使用来自第二个data.table的列通过引用与data.table分配时,结果不一致。当两个data.table的键列都没有匹配时,似乎完全忽略了分配表达式y := y - 甚至不返回NA

library(data.table)
dt1 <- data.table(id = 1:2, x = 3:4, key = "id")
dt2 <- data.table(id = 3:4, y = 5:6, key = "id")
print(dt1[dt2, y := y])
##    id x     # Would have also expected column:   y
## 1:  1 3     #                                   NA
## 2:  2 4     #                                   NA

但是,如果存在部分匹配,则不匹配的列会占位符NA

dt2[, id := 2:3]
print(dt1[dt2, y := y])
##    id x  y
## 1:  1 3 NA    # <-- placeholder NA here
## 2:  2 4  5

这会对以后的代码造成严重破坏,该代码假定在所有情况下都存在y列。否则,我不得不编写繁琐的额外检查以考虑这两种情况。

这种不一致是否有一种优雅的方式?

2 个答案:

答案 0 :(得分:2)

使用this recent commit,此问题#759现已在v1.9.7中修复。它在nomatch=NA(当前默认值)时按预期工作。

require(data.table)
dt1 <- data.table(id = 1:2, x = 3:4, key = "id")
dt2 <- data.table(id = 3:4, y = 5:6, key = "id")
dt1[dt2, y := y][]
#    id x  y
# 1:  1 3 NA
# 2:  2 4 NA

答案 1 :(得分:1)

使用合并作品:

> dt3 <- merge(dt1, dt2, by='id', all.x=TRUE)
> dt3
   id x  y
1:  1 3 NA
2:  2 4 NA