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
相关产品推荐
相关产品推荐

