【问题标题】:R: Determine if each date interval overlaps with all other date intervals in a dataframeR:确定每个日期间隔是否与数据框中的所有其他日期间隔重叠
【发布时间】:2019-10-08 09:47:01
【问题描述】:

对于我的数据框中的每个日期间隔行,我想确定它是否与所有其他日期间隔重叠。排除自身。

具有开始和结束日期的数据框,表示间隔:

`data <- read.table(header=TRUE,text="
start.date             end.date
2019-09-01             2019-09-10
2019-09-05             2019-09-07
2019-08-25             2019-09-05
2019-10-10             2019-10-15
")`

此函数lubridate::int_overlaps() 通过返回逻辑 TRUE 或 FALSE 来检查两个日期间隔是否重叠。

`int_overlaps(interval(ymd("2019-09-01"),ymd("2019-09-10")), interval(ymd("2019-09-05"), ymd("2019-09-07")))
[1] TRUE
int_overlaps(interval(ymd("2019-09-01"),ymd("2019-09-10")), interval(ymd("2019-10-10"), ymd("2019-10-15")))
[1] FALSE`

我想使用 int_overlap() 将每个日期间隔与除自身之外的所有其他日期间隔进行迭代,以确定它是否与其他日期重叠。

输出应如下所示:

`data <- read.table(header=TRUE,text="
start.date             end.date         overlaps
2019-09-01             2019-09-10       TRUE
2019-09-05             2019-09-07       TRUE
2019-08-25             2019-09-05       TRUE
2019-10-10             2019-10-15       FALSE
")
`

【问题讨论】:

    标签: r dplyr lubridate


    【解决方案1】:

    这是一个使用dplyrpurrr 的选项,我们循环遍历Int 的索引,将当前区间与其他区间进行比较。

    library(dplyr)
    library(purrr)
    library(lubridate)
    data %>% mutate(Int = interval(start.date, end.date), 
                    overlaps = map(seq_along(Int), function(x){
                      #browser()
                      #Get all Int indexes other than the current one
                      y = setdiff(seq_along(Int), x)
                      #The interval overlaps with all other intervals
                      #return(all(int_overlaps(Int[x], Int[y])))
                      #The interval overlaps with any other intervals
                      return(any(int_overlaps(Int[x], Int[y])))
                    }))
    
      start.date   end.date                            Int overlaps
    1 2019-09-01 2019-09-10 2019-09-01 UTC--2019-09-10 UTC     TRUE
    2 2019-09-05 2019-09-07 2019-09-05 UTC--2019-09-07 UTC     TRUE
    3 2019-08-25 2019-09-05 2019-08-25 UTC--2019-09-05 UTC     TRUE
    4 2019-10-10 2019-10-15 2019-10-10 UTC--2019-10-15 UTC    FALSE
    

    【讨论】:

    • 我很惊讶! .. 正是我使用any()map()seq_along() 寻找的答案。非常感谢阿布贝克 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    相关资源
    最近更新 更多