扩展日期区间后dplyr判断区间重叠异常问题求助
问题根源与解决方案
你遇到的问题核心是误用了lubridate的%within%运算符逻辑:
- 当
%within%两边都是Interval对象时,它判断的是左侧的整个区间完全被包含在右侧的某个区间内,而不是两个区间存在重叠。 - 原
interval_A中有一个区间恰好完全落在interval_B的某个区间里,所以返回1个TRUE;延长后的interval_A_plus12没有任何一个完整区间被interval_B包含,因此全返回FALSE,但这和你“判断区间是否存在重叠”的需求不符。
正确实现:判断区间是否存在重叠
我们需要判断interval_A_plus12中的每个区间,是否与interval_B中的任意区间存在重叠。区间重叠的核心逻辑是:A区间的起始时间 < B区间的结束时间,且A区间的结束时间 > B区间的起始时间。
用dplyr+purrr实现如下:
library(dplyr) library(purrr) library(lubridate) tibble( interval_A_plus12, has_overlap_with_B = map_lgl(interval_A_plus12, function(a_int) { any(start(a_int) < end(interval_B) & end(a_int) > start(interval_B)) }) )
验证前两个区间的重叠情况
以interval_A_plus12的前两个区间为例:
- 第一个区间:起始
1972-12-30,结束1974-12-30,与interval_B的第一个区间(1973-12-30至1975-02-28)存在重叠,返回TRUE。 - 第二个区间:起始
1974-03-30,结束1975-03-30,同样与interval_B的第一个区间重叠,返回TRUE。
替代方案:用lubridate::intersect判断交集
也可以通过intersect函数判断两个区间是否有非空交集(返回非空区间则说明重叠):
tibble( interval_A_plus12, has_overlap_with_B = map_lgl(interval_A_plus12, function(a_int) { any(map_lgl(interval_B, ~ !is.na(intersect(a_int, .x)))) }) )
内容的提问来源于stack exchange,提问作者DaveM
相关产品推荐
相关产品推荐

