使用另一数据 table 中一列的值更新一个数据 table 中的一列 NA

Update a column of NAs in one data table with the value from a column in another data table

我在这个主题上看到过类似的 post,但无法理解解决方案。本质上,我有一个数据 table (DT1),其中包含分数和一些 NA。只要有 'NA',我就想要一个引用另一个数据 (DT2) table 的过程,该数据在两个 tables (tract) 中都有一个公共列,然后更新 DT1 中的 NA DT2 的分数列的值。我选择数据 table class 因为我认为这是一个有效的选择。

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  

我们为我们正在处理的其他小插图创建了新的(更全面的)HTML vignettes for some of the data.table concepts. Have a look here。我正在研究连接的小插图,完成后有望更好地澄清这些类型的问题。


想法是首先 setkey()DT1tract 上。

setkey(DT1, tract)

在 data.tables 中,x[i] 形式的连接需要 x 的键,但 i 则不一定。这导致两种情况:

  • 如果 i 也有键集——i 的第一个键列与 x 的第一个键列匹配,第二个键列与第二个键列匹配,依此类推在..

  • 如果 i 没有键集 -- i 的第一列与第一个 key 列匹配xi 的第二列与 x 的第二 key 列,依此类推..

在这种情况下,由于您在 i 中的第一列也是 tract,我们将跳过在 i 上设置键。

然后,我们执行 x[i] 形式的连接。通过这样做,对于每个 i,计算 x 中的匹配行索引,然后实现连接结果。但是,我们不希望将整个连接结果作为一个新的 data.table。相反,我们想用匹配行上的 DT2 更新 DT1CreditScore 列..

在data.tables中,我们可以通过提供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 部分为 DT2 中的每一行查找 DT1 中的匹配行。如果匹配,我们希望 DT2 的值在 DT1 中更新。我们通过使用 i.CreditScore 来实现——它指的是 DT2CreditScore 列(i. 是一个前缀,用于区分 x 之间具有相同名称的列和 i data.tables).


更新: 正如评论中指出的那样,上述解决方案还将更新 DT1 中的非 NA 值。因此,这样做的方法是:

DT1[is.na(CreditScore), CreditScore := DT2[.(.SD), CreditScore]]

DT1 中的 CreditScoreNA 的那些行上,将 DT1 中的 CreditScore 替换为从 CreditScore 中获得的值DT2[.(.SD)] 的连接,其中 .SD 对应于 data.table 的子集,其中包含 CreditScoreNA.

的所有行

HTH