使用来自第二个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
列。否则,我不得不编写繁琐的额外检查以考虑这两种情况。
这种不一致是否有一种优雅的方式?
答案 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