使用另一数据 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()
在 DT1
列 tract
上。
setkey(DT1, tract)
在 data.tables 中,x[i]
形式的连接需要 x
的键,但 i
则不一定。这导致两种情况:
如果 i
也有键集——i
的第一个键列与 x
的第一个键列匹配,第二个键列与第二个键列匹配,依此类推在..
如果 i
没有键集 -- i
的第一列与第一个 key 列匹配x
,i
的第二列与 x
的第二 key 列,依此类推..
在这种情况下,由于您在 i
中的第一列也是 tract
,我们将跳过在 i
上设置键。
然后,我们执行 x[i]
形式的连接。通过这样做,对于每个 i
,计算 x
中的匹配行索引,然后实现连接结果。但是,我们不希望将整个连接结果作为一个新的 data.table。相反,我们想用匹配行上的 DT2
更新 DT1
的 CreditScore
列..
在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
来实现——它指的是 DT2
的 CreditScore
列(i.
是一个前缀,用于区分 x
之间具有相同名称的列和 i
data.tables).
更新: 正如评论中指出的那样,上述解决方案还将更新 DT1
中的非 NA 值。因此,这样做的方法是:
DT1[is.na(CreditScore), CreditScore := DT2[.(.SD), CreditScore]]
在 DT1
中的 CreditScore
为 NA
的那些行上,将 DT1
中的 CreditScore
替换为从 CreditScore
中获得的值DT2[.(.SD)]
的连接,其中 .SD
对应于 data.table 的子集,其中包含 CreditScore
为 NA
.
的所有行
HTH
我在这个主题上看到过类似的 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()
在 DT1
列 tract
上。
setkey(DT1, tract)
在 data.tables 中,x[i]
形式的连接需要 x
的键,但 i
则不一定。这导致两种情况:
如果
i
也有键集——i
的第一个键列与x
的第一个键列匹配,第二个键列与第二个键列匹配,依此类推在..如果
i
没有键集 --i
的第一列与第一个 key 列匹配x
,i
的第二列与x
的第二 key 列,依此类推..
在这种情况下,由于您在 i
中的第一列也是 tract
,我们将跳过在 i
上设置键。
然后,我们执行 x[i]
形式的连接。通过这样做,对于每个 i
,计算 x
中的匹配行索引,然后实现连接结果。但是,我们不希望将整个连接结果作为一个新的 data.table。相反,我们想用匹配行上的 DT2
更新 DT1
的 CreditScore
列..
在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
来实现——它指的是 DT2
的 CreditScore
列(i.
是一个前缀,用于区分 x
之间具有相同名称的列和 i
data.tables).
更新: 正如评论中指出的那样,上述解决方案还将更新 DT1
中的非 NA 值。因此,这样做的方法是:
DT1[is.na(CreditScore), CreditScore := DT2[.(.SD), CreditScore]]
在 DT1
中的 CreditScore
为 NA
的那些行上,将 DT1
中的 CreditScore
替换为从 CreditScore
中获得的值DT2[.(.SD)]
的连接,其中 .SD
对应于 data.table 的子集,其中包含 CreditScore
为 NA
.
HTH