通过 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
我有两个数据框,我想按一列中最接近的值合并它们。第一个数据框 (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