我有两个数据框。第一个包含图像的原始状态以及可用于从头开始重建图像的所有数据(整个坐标集及其颜色值)。
然后我有第二个数据框。这个较小,仅包含有关更新状态和原始状态之间差异(所做的更改)的数据。有点像带有关键帧的视频编码。
不幸的是,我没有唯一的 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/