如何用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
相关产品推荐
相关产品推荐

