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

如何用R语言基于第二个表格的日期范围合并两个数据框?

在R中按日期范围匹配合并两个数据框

原始数据

df_1 <- data.frame(DATES_1=c("12-30-2022", "03-02-2023","05-05-2023"),
                   DV01_1=c(1,2,3))
df_2 <- data.frame(DATES_2=c("01-01-2023", "02-01-2023", "05-01-2023","06-01-2023"),
                   DV01_2=c(1,2,3,4))

需求说明

将df_1中的DV01_1值按df_2的日期范围匹配到df_2:

  • 当df_1$DATES_1落在df_2的前一个日期与当前日期之间时,将对应DV01_1值匹配到当前df_2行
  • 无匹配项时填充0,最终得到目标数据框df_3

解决方案(dplyr版)

步骤1:转换日期格式

先把字符型日期转为R可识别的Date类型,才能进行区间比较:

library(dplyr)

df_1 <- df_1 %>% mutate(DATES_1 = as.Date(DATES_1, format = "%m-%d-%Y"))
df_2 <- df_2 %>% mutate(DATES_2 = as.Date(DATES_2, format = "%m-%d-%Y"))

步骤2:匹配日期区间并合并

用findInterval定位每个df_1日期对应的df_2区间,再合并填充空值:

# 给df_2添加临时索引,用于后续匹配
df_2 <- df_2 %>% mutate(idx = row_number())

# 计算每个df_1日期对应的df_2行索引
df_1 <- df_1 %>% 
  mutate(match_idx = findInterval(DATES_1, df_2$DATES_2)) %>%
  # 小于df_2第一个日期的匹配项设为NA,后续填充0
  mutate(match_idx = ifelse(match_idx == 0, NA, match_idx))

# 合并数据并填充0
df_3 <- df_2 %>%
  left_join(df_1 %>% select(match_idx, DV01_1), by = c("idx" = "match_idx")) %>%
  mutate(DV01_1 = replace_na(DV01_1, 0)) %>%
  select(-idx) # 移除临时索引列

查看结果

print(df_3)
#        DATES_2 DV01_2 DV01_1
# 1 2023-01-01      1      0
# 2 2023-02-01      2      0
# 3 2023-05-01      3      2
# 4 2023-06-01      4      3

解决方案(Base R版)

如果不想用dplyr,也可以用原生R实现:

# 转换日期格式
df_1$DATES_1 <- as.Date(df_1$DATES_1, "%m-%d-%Y")
df_2$DATES_2 <- as.Date(df_2$DATES_2, "%m-%d-%Y")

# 定位每个df_1日期对应的df_2区间索引
match_idx <- findInterval(df_1$DATES_1, df_2$DATES_2)
match_idx[match_idx == 0] <- NA

# 创建匹配的DV01_1向量,无匹配项填充0
dv01_vec <- numeric(nrow(df_2))
dv01_vec[match_idx] <- df_1$DV01_1

# 合并得到目标数据框
df_3 <- cbind(df_2, DV01_1 = dv01_vec)

内容的提问来源于stack exchange,提问作者André F

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:01:19