【问题标题】:R function to determine the overlap between two date intervals -- DescTools Interval FunctionR函数确定两个日期间隔之间的重叠——DescTools间隔函数
【发布时间】:2020-04-22 21:42:50
【问题描述】:

我正在寻找一种方法来确定两个日期间隔之间的重叠(以天为单位)。我有列 startdate1、enddate1、startdate2、enddate2。我想要一个额外的列,其中包含间隔 (startdate1, enddate1) 和 (startdate2, enddate2) 之间的重叠天数。
例如,我想得到这样的结果:

startdate1      enddate1      startdate2      enddate2      overlap
1/1/2020        1/10/2020     1/6/2020        1/16/2020     5
1/15/2020       1/29/2020     1/6/2020        1/20/2020     6
1/15/2020       1/29/2020     1/17/2020       1/20/2020     4

我一直在尝试使用 DescTools 包中的 Interval 函数来实现这一点:

df1$overlap<- Interval(as.Date(c(df1$startdate1, df1$enddate1)), as.Date(c(df1$startdate2, df1$enddate2)))

但我收到错误错误:

as.Date.numeric(c(df1$startdate1, df1$enddate1)) : 'origin' 必须提供"

我还研究了 lubridate 包——我使用了间隔函数(不同于上面的 DescTools 间隔)来创建列 interval1 和 interval2,但我不知道有一个函数可以计算两者之间的重叠天数他们。

感谢任何帮助。提前致谢!

【问题讨论】:

    标签: r intervals lubridate desctools


    【解决方案1】:

    如果我理解正确,您可以通过简单地从startdate2 中减去enddate1 来实现。您可以使用 R 之类的基本 as.Date() 函数来做到这一点:

    as.Date(enddate1, "%m/%d/%Y") - as.Date(startdate2, "%m/%d/%Y") + 1
    

    字符串%m/%d/%Y 指定日期的格式,在您的情况下为月/日/年。我添加了+1,因为上面计算了日期之间的差异(如10 - 6 = 4),不包括开始日期,而为了获得重叠,我们还想计算开始日期本身。

    【讨论】:

    • 我没有这样做的原因是因为重叠可以发生在任一方向。例如,interval1=(1/15/20, 1/29/20),interval2=(1/6/20, 1/20/20)。在这种情况下,我需要 enddate2-startdate1 而不是 enddate1-startdate2。我也有完全重叠的区间——区间1=(1/15/20-1/29/20),区间2=(1/17/20-1/22/20)——区间2完全包含在区间1中,所以在那种情况下,我只需要间隔2的长度。我想在一次计算中处理所有这些情况。
    • 我编辑了原始问题以反映这一点——感谢您指出这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2022-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多