You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于多条件右连接并按日期优先级匹配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

代码说明

  1. 优先级标记:通过case_when明确三层匹配优先级,确保目标日期是第一选择,其次是30天内的最近数据,最后是历史最近数据。
  2. 分组筛选:按id分组后排序,仅保留每组优先级最高、日期最接近的记录,避免同一id多条数据干扰。
  3. 关联映射:使用left_join保证df_2的所有id都被保留,同时匹配到对应的x2值。

内容的提问来源于stack exchange,提问作者newt335

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:47:30