r - 与基于多个非唯一列的替换合并

标签 r merge data.table dplyr

我有两个数据框。第一个包含图像的原始状态以及可用于从头开始重建图像的所有数据(整个坐标集及其颜色值)。

然后我有第二个数据框。这个较小,仅包含有关更新状态和原始状态之间差异(所做的更改)的数据。有点像带有关键帧的视频编码。

不幸的是,我没有唯一的 ID 列来帮助我匹配它们。我有一个 x 列和一个 y 列,它们结合起来可以构成一个唯一的 ID。

我的问题是:合并这两个数据集的优雅方法是什么,将原始数据框中的值替换为 x y 坐标匹配的“差异”数据框中的值.

这里有一些示例数据来说明:

original <- data.frame(x = 1:10, y = 23:32, value = 120:129)

    x  y value
1   1 23   120
2   2 24   121
3   3 25   122
4   4 26   123
5   5 27   124
6   6 28   125
7   7 29   126
8   8 30   127
9   9 31   128
10 10 32   129

以及具有更新差异的数据框:

update <- data.frame(x = c(1:4, 8), y = c(2, 24, 17, 23, 30), value = 50:54)

  x  y value
1 1  2    50
2 2 24    51
3 3 17    52
4 4 23    53
5 8 30    54

所需的最终输出应包含原始 数据框中的所有行。但是,原始 中 x 和 y 坐标两者更新中的相应坐标匹配的行应该有它们的 替换为 update 数据框中的值。这是所需的输出:

original_updated <- data.frame(x = 1:10, y = 23:32, 
                               value = c(120, 51, 122:126, 54, 128:129))

    x  y value
1   1 23   120
2   2 24    51
3   3 25   122
4   4 26   123
5   5 27   124
6   6 28   125
7   7 29   126
8   8 30    54
9   9 31   128
10 10 32   129

一段时间以来,我一直试图想出一个带索引的矢量化解决方案,但我想不通。通常我会使用 %in% 如果它只是一个具有唯一 ID 的列。但是这两列不是唯一的。

一种解决方案是将它们视为字符串或元组,并将它们作为坐标对组合到一列中,然后使用 %in%。

但我很好奇是否有任何解决方案可以解决这个涉及使用 bool 向量进行索引的问题。有什么建议吗?

最佳答案

首先以保证所有原始值都存在的方式合并:

merged = merge(original, update, by = c("x","y"), all.x = TRUE)

然后使用 dplyr 尽可能选择 update 的值,否则选择 original 的值:

library(dplyr)
middle = mutate(merged, value = ifelse(is.na(value.y), value.x, value.y))
final = select(middle, x, y, value)

关于r - 与基于多个非唯一列的替换合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43197211/

相关文章:

r - gc() 和 rm() 有什么区别

使用 dplyr 根据另一个向量替换 NA 每列

r - 根据字符串模式拆分 data.table 一行

r - 为什么 R 使用基数排序?

r-exams:完形填空子项中的 R 输出格式

r - Shiny :应用发布时看起来不同

merge - 如何选择要合并附加到工作项的变更集?

python - Pandas合并表: only distinct Ids from second table

java - Svn从分支合并到主干而不删除主干(或其历史记录)

r - 使用最近的非 na-observation 用 NA 值填充 data.table