通过 R 中最接近的值合并两个数据帧

Merge two dataframes by a closest value in R

我有两个数据框,我想按一列中最接近的值合并它们。第一个数据框 (DF1) 由个人及其估计的个人风险(“风险”)组成:

DF1<- data.frame(ID = c(1, 2, 3), risk = c(22, 40, 20))

ID      risk
1       22
2       40
3       20

第二个数据框 (DF2) 由按年龄组划分的人口 ("population_age") 和每个年龄组内的正常风险 ("population_normal_risk") 组成:

DF2<- data.frame(population_age = c("30-34","35-39","40-44"), population_normal_risk = c(15, 30, 45))

population_age      population_normal_risk
30-34                       15
35-39                       30
40-44                       45

我想要的是在 DF1 数据框中添加一个新列,显示风险值(“population_normal_risk”)最接近估计风险的人口年龄组(“population_age”)每个人(“风险”)。

我的预期是:

ID    risk     population_age_group
1     22             30-34
2     40             40-44
3     20             30-34

提前致谢!

我们可以使用findInterval.

首先,我们需要计算人口风险值中间点的断点:

breaks <- c(0, df2$population_normal_risk + c(diff(df2$population_normal_risk) / 2, Inf))

然后使用findInterval检测我们的风险属于哪个bin:

matches <- findInterval(df1$risk, breaks)

最后,将匹配写入:

df1$population_age <- df2$population_age[matches]

给我们:

df1
  ID risk population_age
1  1   22          30-34
2  2   40          40-44
3  3   20          30-34`

我们可以使用 outer + max.col

尝试下面的代码
transform(
    DF1,
    population_age = DF2[max.col(-abs(outer(risk, DF2$population_normal_risk, `-`))), "population_age"]
)

这给出了

  ID risk population_age
1  1   22          30-34
2  2   40          40-44
3  3   20          30-34