如何筛选与另一DataFrame时间差在30分钟内的DataFrame行
解决方案
首先明确两个核心问题:
- 直接按
name做全连接会生成大量冗余行(同一name下的所有行两两配对),效率极低; - 若时间列是字符串格式,无法直接进行时间差运算,这也是报错的常见原因。
步骤1:转换时间列格式
先把A_time和B_time转换成R可识别的POSIXct时间类型,同时提取日期列用于按日期匹配:
library(dplyr) dataframe1 <- dataframe1 %>% mutate(A_time = as.POSIXct(A_time, format = "%m/%d/%y %H:%M"), date = as.Date(A_time)) dataframe2 <- dataframe2 %>% mutate(B_time = as.POSIXct(B_time, format = "%m/%d/%y %H:%M"), date = as.Date(B_time))
步骤2:按name+日期+时间差模糊匹配
使用fuzzyjoin包的模糊连接,先按name和日期精确匹配缩小范围,再过滤时间差≤30分钟的行,比全连接后过滤效率高得多:
library(fuzzyjoin) dataframe3 <- dataframe1 %>% fuzzy_inner_join(dataframe2, by = c("name" = "name", "date" = "date"), match_fun = list(`==`, `==`), keep = FALSE) %>% filter(abs(difftime(A_time, B_time, units = "mins")) <= 30) %>% select(name, A_time, measurement_A, measurement_B) %>% arrange(name, A_time)
代码说明
fuzzy_inner_join先确保name和日期完全匹配,避免跨日期的无效配对;difftime精准计算时间差并判断是否在30分钟内;- 最后筛选并整理目标列,得到与预期一致的结果。
内容的提问来源于stack exchange,提问作者ol1975
相关产品推荐
相关产品推荐

