使用重复键值更新数据 table 的 "selected" 行的 "multiple" 列

updating "multiple" columns of "selected" rows of a data table with duplicate key values

我正在处理具有一百万行奇数的数据 table。它有一个非唯一的密钥。一个特定的列(比如 v1)有几行 NA。当 v1 有 NA 时,我需要更新此列 (v1) 和另一列 (v2)。更新这些列的值来自另一个数据 table。以下代码模拟数据集:

set.seed(1)
DT1<-data.table(
        id1=c(rep(1, 3), rep(2, 3)), 
        id2=c("a", "e", "n", "e", "e", "c"), 
        v1=c(rnorm(1), rep(NA,2),  rnorm(1), NA, rnorm(1)), 
        v2=rnorm(6))
setkey(DT1, id2)

DT2<-data.table(id2=c("n","u", "e"), v1=c(1, 2, 3), v2=c(11, 22, 33))
setkey(DT2, id2)
DT1; DT2

更新后 DT1 将显示为:

> DT1
   id1 id2         v1         v2
1:   1   a -0.6264538  1.5952808
2:   2   c -0.8356286  0.5757814
3:   1   e          3         33
4:   2   e  0.1836433  0.4874291
5:   2   e          3         33
6:   1   n          1         11

请注意第 4 行没有更新,因为 v1 有一个值。

我尝试了以下代码,但它更新了所有匹配的行(包括第 4 行)

DT1[DT2[unique(DT1[is.na(v1), id2]),nomatch=0], c("v1","v2"):=list(i.v1,i.v2)]

如果我为上面的代码(下面给出)提供一个过滤器,DT1 保持不变。

DT1[is.na(v1)][DT2[unique(DT1[is.na(v1), id2]),nomatch=0], c("v1","v2"):=list(i.v1,i.v2)]

我做错了什么?

对于这样的问题,编写 R/data.table 代码的更优雅的方法是什么?

请帮忙。

这是一种可能性:

DT1[is.na(v1), c("v1", "v2") := DT2[.SD[["id2"]], list(v1, v2)]]
#   id1 id2         v1         v2
#1:   1   a -0.6264538  1.5952808
#2:   2   c -0.8356286  0.5757814
#3:   1   e  3.0000000 33.0000000
#4:   2   e  0.1836433  0.4874291
#5:   2   e  3.0000000 33.0000000
#6:   1   n  1.0000000 11.0000000