如何加入和覆盖数据似乎是一个常见的请求,但我尚未找到适用于整个数据集的优雅解决方案。
(注意:为了简化数据,我将仅使用 1 和 NA 来表示值和一小部分列,但实际上我有数百个具有不同值的列)。
我有一个数据表 (d1),在某些列和行中具有 NA 值。
library(data.table)
d1 = fread(
"r id v1 v2 v3
1 A 1 1 1
2 B 1 1 1
3 C 1 NA NA
4 D 1 1 NA
5 E 1 NA 1")[, r := NULL]
我还有另一个数据表 (d2),其中包含附加列以及 d1 中现有列中缺少的数据点。
d2 = fread(
"r id v2 v3 v4 v5
1 C 1 1 1 1
2 D 1 1 1 1
3 E 1 1 1 1")[, r := NULL ]
我基本上想用 d2 中的所有数据连接+覆盖 d1,当然要确保按 id 匹配行,按名称匹配列,如下所示。
> d12
id v1 v2 v3 v4 v5
1 A 1 1 1 NA NA
2 B 1 1 1 NA NA
3 C 1 1 1 1 1
4 D 1 1 1 1 1
5 E 1 1 1 1 1
附加场景:我还想知道如果您只想更新 d1 中的 NA 值(即确保现有的非 NA 值不被覆盖),如何做到这一点。 (为了使其更容易可视化,我添加了同时包含 1 和 0 的新表)。
例如,如果我们有 d3
d3 = fread(
"r id v1 v2 v3
1 A 1 1 1
2 B 1 1 1
3 C 1 0 NA
4 D 1 1 0
5 E 1 NA 1")[, r := NULL ]
我们想加入 d2 并仅覆盖 NA 以获得:
> d32
id v1 v2 v3 v4 v5
1 A 1 1 1 NA NA
2 B 1 1 1 NA NA
3 C 1 0 1 1 1
4 D 1 1 0 1 1
5 E 1 1 1 1 1
仅供参考,下面是解决此问题的其他一些帖子,但仅针对一两列。我正在寻找的解决方案应该允许一个表中的数据被另一个表中的许多(如果不是全部)列覆盖。
合并数据帧并覆盖值
合并两个数据框并替换R中的NA值
A 数据表基于 的解决方案将是首选,但也欢迎其他解决方案。