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

如何从另一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)

代码说明

  1. 分组处理:按country分组,确保每个国家的日期匹配独立进行。
  2. 日期筛选:对df1中的每个date,从df2中筛选出同国家且elDate大于当前date的所有日期,取其中最小值(即最接近目标date的符合条件日期)。
  3. 格式调整:将数值型日期转换回Date格式,并调整为dd-mm-yyyy的显示样式,与期望结果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:20:33