我在这个主题上看过类似的帖子,但无法理解解决方案。基本上我有一个数据表(DT1)与分数和一些NA。只要有'NA',我想要一个引用另一个数据(DT2)表的过程,该表在两个表(通道)中都有一个公共列,然后使用DT2的得分列值更新DT1中的NA。我选择的是数据表类,因为我觉得它是一个有效的选项。
DT1
tract CreditScore
1: 36107020401 635
2: 36083052403 NA
3: 36091062602 NA
4: 36067013000 NA
5: 36083052304 NA
DT2
tract CreditScore
1: 36107020401 635
2: 36083052403 650
3: 36091062602 335
4: 36067013000 777
5: 36083052304 663
答案 0 :(得分:11)
我们为一些data.table概念创建了新的(更全面的)HTML vignettes。看看我们正在研究的其他小插曲here。我正在研究连接的小插图,这样做有希望更好地澄清这些类型的问题。
我们的想法是在setkey()
列上的DT1
上tract
开始。
setkey(DT1, tract)
在data.tables中,表单x[i]
的联接需要x
的键,但不一定是i
的键。这导致两种情况:
如果i
也有密钥集,则i
的第一个键列与x
的第一个键列匹配,第二个键与第二个键匹配,依此类推。< / p>
如果i
没有设置密钥,则i
的第一列与x
的第一个密钥列匹配} i
的第二列与x
的第二个键列等等。
在这种情况下,由于i
中的第一列也是tract
,我们会跳过i
上的设置键。
然后,我们执行x[i]
形式的连接。通过这样做,对于每个i
,计算x
中的匹配行索引,然后实现连接结果。但是,我们不希望将整个连接结果作为新的data.table。相反,我们希望在这些匹配的行上使用DT1
更新CreditScore
的{{1}}列。
在data.tables中,我们可以在加入时通过提供DT2
中的表达式来执行该操作,如下所示:
j
DT1[DT2, CreditScore := i.CreditScore]
# tract CreditScore
# 1: 36067013000 777
# 2: 36083052304 663
# 3: 36083052403 650
# 4: 36091062602 335
# 5: 36107020401 635
部分为DT1[DT2
中的每一行DT1
找到匹配的行。如果匹配,我们希望在DT2
中更新DT2
的值。我们使用DT1
来实现这一目标 - 它引用了i.CreditScore
的{{1}}列(DT2
是一个前缀,用于区分{CreditScore
之间具有相同名称的列1}}和i.
data.tables)。
更新:正如评论中所指出的,上述解决方案还会更新x
中的非NA值。因此,这样做的方法是:
i
在来自DT1
的{{1}}为DT1[is.na(CreditScore), CreditScore := DT2[.(.SD), CreditScore]]
的行中,将CreditScore
替换为来自DT1
的{{1}}来自联接的NA
CreditScore
的{{1}},其中DT1
对应于data.table的子集,其中包含CreditScore
为DT2[.(.SD)]
的所有行。
HTH