You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

扩展日期区间后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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:50:28