Непоследовательное присвоение данных.

При назначении по ссылке с помощью data.table с использованием столбца из второго data.table результаты несовместимы. Если совпадений по ключевым столбцам как data.table s нет совпадений, появляется выражение-ассистент 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. В противном случае мне приходится писать громоздкие дополнительные проверки, чтобы учесть оба случая.

Есть ли элегантный способ преодоления этой несогласованности?

Ответ 1

С этот недавний коммит, эта проблема, # 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

Ответ 2

Использование операций слияния:

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