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

在R中通过精确匹配ID和最近日期合并两个DataFrame

按ID匹配并关联最近日期的DataFrame合并问题

需要将df2中的Score.Y和Date.Y字段,按照相同ID且最接近的日期匹配到df1中,得到指定的预期结果。用户尝试用dplyr实现但未成功,给出的代码如下:

library(dplyr)
result <- df1 %>% 
  left_join(df2, by="ID") %>% 
  group_by(ID) %>% 
  mutate(diff = abs(as.numeric(difftime(Date.X, Date.Y, units="days")))) %>% 
  slice_min(diff) %>% 
  select(-diff

原始数据结构

df1结构

structure(list(ID = c("A", "A", "A", "A", "B", "B", "C", "C", 
"C", "C"), Date.X = structure(c(1452643200, 1452643200, 1452643200, 
1560556800, 1491177600, 1537142400, 1524700800, 1524787200, 1452297600, 
1417132800), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    Score.X = c(40, 50, 10, 45, 60, 100, 90, 400, 376, 276)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -10L))

df2结构

structure(list(ID = c("A", "A", "A", "B", "B", "B", "B", "C", 
"C"), Date.Y = structure(c(1433462400, 1474588800, 1511740800, 
1431475200, 1442188800, 1537747200, 1577404800, 1451606400, 1493942400
), class = c("POSIXct", "POSIXt"), tzone = "UTC"), Score.Y = c(35, 
39, 130, 240, 126, 100, 95, 327, 257)), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -9L))

预期结果结构

structure(list(ID = c("A", "A", "A", "A", "B", "B", "C", "C", 
"C", "C"), Date.X = structure(c(1452643200, 1452643200, 1452643200, 
1560556800, 1491177600, 1537142400, 1524700800, 1524787200, 1452297600, 
1417132800), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    Score.X = c(40, 50, 10, 45, 60, 100, 90, 400, 376, 276), 
    Score.Y = c(35, 35, 35, 130, 100, 100, 257, 257, 327, 327
    ), Date.Y = structure(c(1433462400, 1433462400, 1433462400, 
    1511740800, 1537747200, 1537747200, 1493942400, 1493942400, 
    1451606400, 1451606400), class = c("POSIXct", "POSIXt"), tzone = "UTC")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -10L))

问题修正与解决方案

原代码存在两个核心问题:

  1. 分组范围错误:仅按ID分组会将同一ID下的所有df1行合并处理,无法保留原df1的每行结构,应该按ID + Date.X + Score.X分组,确保为df1的每一行单独匹配最近日期的df2记录。
  2. 语法错误:select(-diff)缺少闭合括号,导致代码无法运行。

修正后的完整代码:

library(dplyr)

result <- df1 %>%
  left_join(df2, by = "ID") %>%
  # 按df1的唯一行标识分组
  group_by(ID, Date.X, Score.X) %>%
  # 计算日期差的绝对值(单位:天)
  mutate(diff = abs(as.numeric(difftime(Date.X, Date.Y, units = "days")))) %>%
  # 取每组中日期差最小的记录,with_ties=FALSE确保仅保留一条(若有相同最小差可根据需求调整)
  slice_min(diff, with_ties = FALSE) %>%
  # 移除临时计算的diff字段
  select(-diff) %>%
  # 取消分组,恢复常规数据框结构
  ungroup()

运行上述代码后,得到的结果与预期结构完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:45:34