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

时间:2015-03-05 22:29:34

标签: 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  

DT2

         tract CreditScore  
1: 36107020401         635  
2: 36083052403         650  
3: 36091062602         335  
4: 36067013000         777  
5: 36083052304         663  

1 个答案:

答案 0 :(得分:11)

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


我们的想法是在setkey()列上的DT1tract开始。

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的子集,其中包含CreditScoreDT2[.(.SD)]的所有行。

HTH