数据表赋值的行为不一致

14

当使用第二个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
你可以首先创建“y”列... dt1[, y:=NA_integer_];dt1[dt2, y:=y][] - GSee
我认为最优雅的方式是在 Github 上提交一个功能请求 ;) - eddi
3
@eddi - 谢谢。请参见https://github.com/Rdatatable/data.table/issues/759 - mchen
另一方面,当y不在连接表中时,我更快地注意到了代码中的错误。但是,你提出的建议可能更好,因为它更加健壮。 - MichaelChirico
2个回答

2

通过最近的提交,这个问题#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
使用合并功能可行:
> dt3 <- merge(dt1, dt2, by='id', all.x=TRUE)
> dt3
   id x  y
1:  1 3 NA
2:  2 4 NA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接