基于大于等于条件的非精确数据连接问题求助
实现基于
>=条件的非精确匹配连接 数据说明
- df数据:
# A tibble: 7 × 1 var1 <dbl> 1 0 2 10 3 20 4 210 5 230 6 266 7 267
- value_lookup匹配表:
# A tibble: 4 × 2 var1 value <dbl> <dbl> 1 0 0 2 200 10 3 230 20 4 260 30
需求
将df的var1与value_lookup中**满足df$var1 >= value_lookup$var1的最大var1对应的value**进行匹配,预期输出:
var1 value 1 0 0 2 10 0 3 20 0 4 210 10 5 230 20 6 266 30 7 267 30
原尝试代码(未成功)
value_lookup <- tibble(var1 = c(0, 200,230,260), value = c(0,10,20,30)) df <- tibble(var1 = c(0,10,20,210,230,266,267)) library(fuzzyjoin) fuzzyjoin::fuzzy_left_join( x = df, y = value_lookup , by = "var1", match_fun = list(`>=`) )
解决方案
方法1:修正fuzzyjoin用法
原代码仅完成了模糊匹配,但未筛选出每个df$var1对应的最大匹配项。需先匹配所有符合条件的记录,再分组筛选最大值对应的value:
library(fuzzyjoin) library(dplyr) fuzzy_left_join(df, value_lookup, by = "var1", match_fun = `>=`) %>% group_by(var1.x) %>% filter(var1.y == max(var1.y)) %>% ungroup() %>% select(var1 = var1.x, value)
方法2:dplyr结合findInterval(高效简洁)
利用findInterval直接定位每个var1在匹配表中的区间位置,该函数默认按升序匹配满足条件的最大阈值,完美契合需求:
library(dplyr) df %>% mutate(value = value_lookup$value[findInterval(var1, value_lookup$var1)])
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

