如何从另一DataFrame中选取指定日期之上的最近对应日期
解决方案
要实现为df1中每条记录匹配对应国家、大于当前date的最近elDate,可通过tidyverse分组处理结合日期筛选完成,代码如下:
library(tidyverse) library(lubridate) # 原始数据 df1 <- tibble(country = c(rep("Albania", 11), rep("Algeria", 7)), date = ymd("1996-12-24", "1997-01-30", "2009-07-30", "2011-07-08", "2012-04-18", "2012-01-20", "2013-05-16", "2016-03-03", "2017-05-11", "2018-09-07", "2022-05-31", "2005-01-10", "2006-07-12", "2012-10-09", "2012-11-15", "2014-04-18", "2017-06-07", "2017-01-24")) df2 <- tibble(country = c(rep("Albania", 9), rep("Algeria", 6)), elDate = ymd("2025-04-25", "2021-04-25", "2017-06-25", "2013-06-25", "2009-06-28", "2005-07-03", "2001-07-08", "1997-06-29", "1996-05-26", "2021-06-12", "2017-05-04", "2012-05-10", "2007-05-17", "2007-05-30", "2002-05-30")) # 生成结果 result <- df1 %>% group_by(country) %>% mutate(elDate = map_dbl(date, ~ { # 筛选当前国家中大于目标date的所有elDate eligible <- df2 %>% filter(country == cur_group()$country, elDate > .x) %>% pull(elDate) # 返回最小的符合条件的日期(即最近的),无匹配则返回NA if (length(eligible) > 0) min(eligible) else NA_real_ })) %>% ungroup() %>% # 转换回日期格式并调整显示样式 mutate(elDate = as_date(elDate), across(c(date, elDate), ~ format(.x, "%d-%m-%Y"))) # 输出完整结果 print(result, n = Inf)
代码说明
- 分组处理:按
country分组,确保每个国家的日期匹配独立进行。 - 日期筛选:对df1中的每个
date,从df2中筛选出同国家且elDate大于当前date的所有日期,取其中最小值(即最接近目标date的符合条件日期)。 - 格式调整:将数值型日期转换回
Date格式,并调整为dd-mm-yyyy的显示样式,与期望结果一致。
内容的提问来源于stack exchange,提问作者bitte
相关产品推荐
相关产品推荐

