【发布时间】:2017-02-16 12:35:23
【问题描述】:
我在 R 中有以下两个数据框:
df1 = data.frame(c("A", "A", "A", "B", "B"), c(1, 11, 21, 35, 45), c(6, 20, 30, 40, 60), c(1, 2, 3, 4, 5))
colnames(df1) = c("X", "Y", "Z", "score")
df1
X Y Z score
1 A 1 6 1
2 A 11 20 2
3 A 21 30 3
4 B 35 40 4
5 B 45 60 5
df2 = data.frame(c("A", "A", "A", "A", "B", "B", "B", "C"), c(1, 6, 21, 50, 20, 31, 50, 10), c(5, 20, 30, 60, 30, 40, 60, 20), c("x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8"))
colnames(df2) = c("X", "Y", "Z", "out")
df2
X Y Z out
1 A 1 5 x1
2 A 6 20 x2
3 A 21 30 x3
4 A 50 60 x4
5 B 20 30 x5
6 B 31 40 x6
7 B 50 60 x7
8 C 10 20 x8
对于 df1 中的每一行,我要检查:
- 是否与 'X' 中的值和 df2 中的任何其他 'X' 值匹配
- 如果上述情况属实:我想检查来自 'Y' 和 'Z' 的值是否在来自 df2 的值 'Y' 和 'Z' 的范围内
- 如果两者都为真:那么我想将 'out' 中的值添加到 df1。
输出应该是这样的:
output = data.frame(c("A", "A", "A", "B", "B"), c(1, 11, 21, 35, 45), c(6, 20, 30, 40, 60), c(1, 2, 3, 4, 5), c("x1, x2", "x2", "x3", "x4", "x5"))
colnames(output) = c("X", "Y", "Z", "score", "out")
X Y Z score out
1 A 1 6 1 x1, x2
2 A 11 20 2 x2
3 A 21 30 3 x3
4 B 35 40 4 x6
5 B 45 60 5 x7
原始 df1 保留有一个额外的列“out”,该列被添加。
“输出”的第 1 行,在“输出”列中包含“x1,x2”。原因:“X”列中的值匹配,范围 1 到 6 与 df2 中的第 1 行和第 2 行重叠。
我之前曾问过这个问题 (Compare values from two dataframes and merge),建议使用 foverlaps 函数。但是,由于 df1 和 df2 之间的列不同以及 df2 中的额外行,我无法使其工作。
【问题讨论】:
标签: r