如何基于多条件右连接并按日期优先级匹配R语言数据?
按优先级日期匹配实现x2列映射到目标数据集
核心思路
先给df_1中的每条数据标记匹配优先级,按「目标日期优先→30天内最接近→历史最接近」的规则排序,每个id仅保留优先级最高的记录,最后与df_2关联完成映射。
实现代码
library(dplyr) # 定义目标匹配日期 target_date <- as.Date("2023-03-01") # 处理df_1:计算优先级并筛选每个id的最优匹配 df_1_filtered <- df_1 %>% mutate( # 标记是否为目标日期 is_target = dates == target_date, # 计算与目标日期的天数差绝对值 date_diff = abs(dates - target_date), # 定义匹配优先级:1=目标日期,2=30天内,3=其他历史数据 priority = case_when( is_target ~ 1, date_diff <= 30 ~ 2, TRUE ~ 3 ) ) %>% group_by(id) %>% # 按优先级升序(1最高)、日期差升序排序,取每组第一条 arrange(priority, date_diff) %>% slice_head(n = 1) %>% ungroup() %>% select(id, x2) # 与df_2关联,保留df_2的所有id并映射x2 df_3 <- df_2 %>% left_join(df_1_filtered, by = "id") # 查看结果 print(df_3)
结果验证
运行后输出与期望一致:
# # A tibble: 5 × 2 # id x2 # <chr> <dbl> # 1 02 21 # 2 03 20 # 3 04 23 # 4 05 27 # 5 09 26
代码说明
- 优先级标记:通过
case_when明确三层匹配优先级,确保目标日期是第一选择,其次是30天内的最近数据,最后是历史最近数据。 - 分组筛选:按
id分组后排序,仅保留每组优先级最高、日期最接近的记录,避免同一id多条数据干扰。 - 关联映射:使用
left_join保证df_2的所有id都被保留,同时匹配到对应的x2值。
内容的提问来源于stack exchange,提问作者newt335
相关产品推荐
相关产品推荐

