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

R语言如何按id、日期分组后通过最近时间匹配连接tibble/dataframe

解法1:tidyverse 方案(符合你当前使用的工具栈)

先将时间列转为秒级数值计算差值,匹配同id、同日期的所有记录后筛选时间差最小的条目即可:

library(tidyverse)
library(lubridate)

# 1. 将两个数据集的time列转为当天总秒数,方便计算时间差
df <- df %>% 
  mutate(time_sec = period_to_seconds(time))
df2 <- df2 %>% 
  mutate(time_sec = period_to_seconds(time))

# 2. 关联后取最近时间匹配
df_output <- df %>%
  # 按id、date精确匹配两个数据集的条目
  left_join(df2, by = c("id", "date"), suffix = c("", "_ref")) %>%
  # 计算时间差绝对值
  mutate(time_diff = abs(time_sec - time_sec_ref)) %>%
  # 按主数据集的每一行分组
  group_by(id, date, time, variable1) %>%
  # 取时间差最小的匹配条目
  arrange(time_diff) %>%
  slice(1) %>%
  ungroup() %>%
  # 清理不需要的中间列
  select(id, date, time, variable1, lat, long)

解法2:data.table 滚动连接方案(大数据量下效率更高)

直接使用data.table的滚动最近匹配特性,代码更简洁、运行速度更快:

library(data.table)
library(lubridate)

# 转为data.table格式
setDT(df)
setDT(df2)

# 转换时间为秒级数值
df[, time_sec := period_to_seconds(time)]
df2[, time_sec := period_to_seconds(time)]

# 设置匹配键:id、date精确匹配,time_sec最近匹配
setkey(df, id, date, time_sec)
setkey(df2, id, date, time_sec)

# 滚动最近连接
df_output <- df2[df, roll = "nearest"][,.(id, date, time, variable1, lat, long)]

两种方案输出结果均和你给出的预期一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:24:00