如何合并和覆盖数据似乎是一个常见的需求,但我还没有找到适用于整个数据集的优雅解决方案。
(注意:为了简化数据,我只使用值为1和NA以及少量列,但实际上我有数百列具有不同的值)。
我有一个数据表(d1),其中某些列和行中有NA值。
我希望把d1与d2的所有数据进行基本连接和覆盖,当然需要通过id匹配行和通过名称匹配列,如下所示。
(注意:为了简化数据,我只使用值为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 ]
我希望把d1与d2的所有数据进行基本连接和覆盖,当然需要通过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
以下是一些解决此问题的帖子,但只适用于一个或两个列。我正在寻找的解决方案应允许另一个表中的许多甚至所有列覆盖一个表中的数据。
基于data.table的解决方案将更受欢迎,但其他方案也可以。