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

use*_*851 9 r reference data.table

我在这个主题上看过类似的帖子,但无法理解解决方案.基本上我有一个数据表(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  
Run Code Online (Sandbox Code Playgroud)

DT2

         tract CreditScore  
1: 36107020401         635  
2: 36083052403         650  
3: 36091062602         335  
4: 36067013000         777  
5: 36083052304         663  
Run Code Online (Sandbox Code Playgroud)

Aru*_*run 11

我们为一些data.table概念创建了新的(更全面的)HTML插图.看看这里的,我们正在从事的其他小插曲.我正在研究连接的小插图,这样做有希望能更好地澄清这些类型的问题.


这个想法是首先setkey()DT1专栏上tract.

setkey(DT1, tract)
Run Code Online (Sandbox Code Playgroud)

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

  • 如果i还有键设置 - 第一个键列i与第一个键列匹配x,第二个键与第二个键匹配,依此类推.

  • 如果i没有按键-的第一列i是针对第一个匹配的的列x,第二列i对第二个的列x等..

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

然后,我们执行表单的连接x[i].通过这样做,计算每个i匹配的行索引x,然后实现连接结果.但是,我们不希望整个连接结果作为新的data.table.相反,我们想要在那些匹配的行上更新DT1's CreditScoreDT2.

在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
Run Code Online (Sandbox Code Playgroud)

DT1[DT2part找到DT1每行中的匹配行DT2.如果有匹配,我们希望DT2更新价值DT1.我们完成,通过使用i.CreditScore-这指DT2CreditScore柱(i.是用于与之间相同的名称来区分列的前缀xidata.tables).


更新:正如评论中指出的那样,上面的解决方案也会更新非NA值DT1.因此,这样做的方法是:

DT1[is.na(CreditScore), CreditScore := DT2[.(.SD), CreditScore]]
Run Code Online (Sandbox Code Playgroud)

在哪里那些行CreditScoreDT1IS NA,取代CreditScoreDT1从值CreditScore从加入的获得DT2[.(.SD)],其中.SD对应于data.table的,其中含有所有行的子集CreditScoreNA.

HTH