【发布时间】:2018-03-27 10:17:19
【问题描述】:
如何加入和覆盖数据似乎是一个常见的请求,但我还没有找到适用于整个数据集的优雅解决方案。
(注意:为了简化数据,我将仅使用 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
仅供参考,以下是解决此问题的其他一些帖子,但仅针对一两列。我正在寻找的解决方案应该允许一个表中的数据被另一个表中的许多(如果不是全部)列覆盖。
Merge data frames and overwrite values
Merge two data frame and replace the NA value in R
基于 data.table 的解决方案将是首选,但也欢迎使用其他解决方案。
【问题讨论】:
标签: r data.table overwrite