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

如何在R中按ID列与最近日期合并两个dataframe

在R中按ID匹配并连接最接近日期的DataFrame

你需要将两个DataFrame按相同ID配对,同时为每个ID的每条记录匹配另一个DataFrame中日期最接近的条目,保留所有列。下面提供几种实用的实现方法:

方法一:使用data.table滚动连接(推荐,大数据集效率更高)

data.table的滚动连接功能可以高效实现同ID下的最近日期匹配,适合处理大规模数据:

# 安装并加载依赖包
if (!require(data.table)) install.packages("data.table")
library(data.table)
library(lubridate)

# 将数据转换为data.table格式
setDT(df1)
setDT(df2)

# 按ID分组,匹配最近日期的条目
merged_dt <- df2[df1, on = .(ID, Date), roll = "nearest"]

# 调整列名与顺序,让结果更直观
setcolorder(merged_dt, c("ID", "var2", "Date", "i.Date"))
setnames(merged_dt, old = "i.Date", new = "df2_Date")

说明

df2[df1, on = .(ID, Date), roll = "nearest"]会以df1为基准,为每个ID的每条记录在df2中找到日期最接近的条目,自动合并所有列。最终结果中df2_Date就是匹配到的df2中的日期。

方法二:使用fuzzyjoin包的差异匹配

如果更习惯dplyr风格的语法,可以用fuzzyjoin包实现日期差异最小的匹配:

# 安装并加载依赖包
if (!require(fuzzyjoin)) install.packages("fuzzyjoin")
library(fuzzyjoin)
library(dplyr)
library(lubridate)

# 匹配同ID下日期差异最小的条目
merged_df <- difference_inner_join(
  df1, df2,
  by = c("ID", "Date"),
  max_dist = Inf,
  distance_col = "date_diff"
) %>%
  group_by(ID, Date.x) %>%
  filter(date_diff == min(date_diff)) %>%
  ungroup() %>%
  select(-date_diff) %>%
  rename(Date_df1 = Date.x, Date_df2 = Date.y)

说明

difference_inner_join会计算同ID下两组日期的差值,随后分组筛选出每个df1记录对应的最小差异条目,完成最近日期匹配。

方法三:dplyr结合purrr分组处理(适合小数据集)

对于小规模数据,也可以用分组遍历的方式实现:

library(dplyr)
library(purrr)
library(lubridate)

# 按ID分组,为每个df1记录匹配df2中最近的日期
merged_df <- df1 %>%
  group_by(ID) %>%
  mutate(
    matched_df2 = map(Date, ~ df2 %>%
                        filter(ID == cur_group()$ID) %>%
                        slice_min(abs(Date - .x), n = 1))
  ) %>%
  unnest(matched_df2) %>%
  rename(Date_df1 = Date.x, Date_df2 = Date.y) %>%
  ungroup()

说明

通过group_by(ID)分组后,用map遍历df1的每个日期,在同ID的df2数据中筛选出日期差最小的条目,最后展开合并结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:05:29