我在这个主题上看过类似的帖子,但无法理解解决方案.基本上我有一个数据表(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
Arun.. 11
我们为一些data.table概念创建了新的(更全面的)HTML插图.看看这里的,我们正在从事的其他小插曲.我正在研究连接的小插图,这样做有希望能更好地澄清这些类型的问题.
这个想法是首先setkey()
在DT1
专栏上tract
.
setkey(DT1, tract)
在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
DT1[DT2
part找到DT1
每行中的匹配行DT2
.如果有匹配,我们希望DT2
更新价值DT1
.我们完成,通过使用i.CreditScore
-这指DT2
的CreditScore
柱(i.
是用于与之间相同的名称来区分列的前缀x
和i
data.tables).
更新:正如评论中指出的那样,上面的解决方案也会更新非NA值DT1
.因此,这样做的方法是:
DT1[is.na(CreditScore), CreditScore := DT2[.(.SD), CreditScore]]
在哪里那些行CreditScore
从DT1
IS NA
,取代CreditScore
从DT1
从值CreditScore
从加入的获得DT2[.(.SD)]
,其中.SD
对应于data.table的,其中含有所有行的子集CreditScore
是NA
.
HTH
我们为一些data.table概念创建了新的(更全面的)HTML插图.看看这里的,我们正在从事的其他小插曲.我正在研究连接的小插图,这样做有希望能更好地澄清这些类型的问题.
这个想法是首先setkey()
在DT1
专栏上tract
.
setkey(DT1, tract)
在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
DT1[DT2
part找到DT1
每行中的匹配行DT2
.如果有匹配,我们希望DT2
更新价值DT1
.我们完成,通过使用i.CreditScore
-这指DT2
的CreditScore
柱(i.
是用于与之间相同的名称来区分列的前缀x
和i
data.tables).
更新:正如评论中指出的那样,上面的解决方案也会更新非NA值DT1
.因此,这样做的方法是:
DT1[is.na(CreditScore), CreditScore := DT2[.(.SD), CreditScore]]
在哪里那些行CreditScore
从DT1
IS NA
,取代CreditScore
从DT1
从值CreditScore
从加入的获得DT2[.(.SD)]
,其中.SD
对应于data.table的,其中含有所有行的子集CreditScore
是NA
.
HTH