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 CreditScore列DT2.
在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-这指DT2的CreditScore柱(i.是用于与之间相同的名称来区分列的前缀x和idata.tables).
更新:正如评论中指出的那样,上面的解决方案也会更新非NA值DT1.因此,这样做的方法是:
DT1[is.na(CreditScore), CreditScore := DT2[.(.SD), CreditScore]]
Run Code Online (Sandbox Code Playgroud)
在哪里那些行CreditScore从DT1IS NA,取代CreditScore从DT1从值CreditScore从加入的获得DT2[.(.SD)],其中.SD对应于data.table的,其中含有所有行的子集CreditScore是NA.
HTH
| 归档时间: |
|
| 查看次数: |
1562 次 |
| 最近记录: |