在R语言中如何匹配早于目标时间戳的最近时间戳?
解决方案
方法一:使用data.table(推荐,大数据场景效率更高)
你需要的是匹配小于等于目标时间的最近时间戳,roll="nearest"会同时考虑前后时间点,不符合需求。正确做法是用roll=TRUE(或等价的roll="inf"),它会自动匹配被连接表中最后一个小于等于当前时间的行。
代码示例:
library(data.table) # 转换为data.table格式 setDT(df1) setDT(df2) # 执行连接,roll=TRUE实现向前匹配最近的早于/等于目标时间的行 result <- df2[df1, on = .(dates2 = dates1), roll = TRUE] # 调整列顺序匹配预期输出 setcolorder(result, c("dates1", "values2", "values1", "dates2")) result
运行后输出与预期一致:
dates1 values2 values1 dates2 1: 2015-10-26 12:00:00 A a 2015-10-26 11:59:00 2: 2015-10-26 13:00:00 C b 2015-10-26 12:00:10 3: 2015-10-26 14:00:00 C c 2015-10-26 12:00:10
方法二:使用tidyverse工具链
如果习惯tidyverse语法,可以结合dplyr和fuzzyjoin实现模糊匹配:
library(dplyr) library(fuzzyjoin) # 模糊左连接,保留所有dates2 <= dates1的行 result <- fuzzy_left_join( df1, df2, by = c("dates1" = "dates2"), match_fun = `<=` ) %>% # 按df1的行分组,筛选每组中最晚的匹配时间 group_by(dates1, values1) %>% filter(dates2 == max(dates2)) %>% ungroup() %>% # 调整列顺序 select(dates1, values2, values1, dates2) result
这段代码先保留所有符合时间条件的匹配行,再分组筛选每组中最接近目标时间的记录,最终得到预期结果。
内容的提问来源于stack exchange,提问作者Ama96
相关产品推荐
相关产品推荐

