如何避免fuzzyjoin::interval_join在区间边界产生重复匹配结果
问题原因
fuzzyjoin::interval_join默认采用左闭右闭的区间匹配逻辑,当左表时间戳恰好等于两个相邻区间的交界点时,会同时满足「≥前一区间起始时间、≤前一区间结束时间」和「≥后一区间起始时间、≤后一区间结束时间」两个匹配规则,因此生成重复的匹配记录。
最优解决方案
最规范的做法是通过match_fun参数自定义区间匹配规则,将区间改为业务中更常用的左闭右开模式,无需事后手动筛选:
result <- fuzzyjoin::interval_join( x = left.data, y = right.data, by = c( "Timestamp" = "PeriodStartTime", "Timestamp" = "PeriodEndTime" ), match_fun = list(`>=`, `<`), # 分别对应两组字段的匹配逻辑 mode = "left" )
修改后交界点的时间戳只会匹配后一个区间,不会再产生重复记录。
特殊场景适配方案
如果业务逻辑必须保留左闭右闭的规则,可在匹配后按左表唯一标识去重,自动保留第一条匹配结果即可:
library(dplyr) result <- fuzzyjoin::interval_join( x = left.data, y = right.data, by = c( "Timestamp" = "PeriodStartTime", "Timestamp" = "PeriodEndTime" ), mode = "left" ) %>% group_by(Data.left, Timestamp) %>% slice_head(n = 1) %>% ungroup()
内容的提问来源于stack exchange,提问作者Someone2
相关产品推荐
相关产品推荐

