使用重复键值更新数据 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
我正在处理具有一百万行奇数的数据 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