根据条件和期间(部分)重叠计算两个期间的日期集之间的重叠天数

时间:2018-12-06 13:07:32

标签: r date overlap mutate period

与发布here的问题类似,我想根据第三个变量(位置)来计算两个时间段之间的重叠天数。

对于主数据集(DF)的每次观察,我都有一个开始和结束日期,以及一个位置(字符)变量。事件数据包含有关事件位置,开始日期和结束日期的信息。允许在同一位置和(部分)重叠时间段内发生多个事件。

因此,对于DF中的每个观察,必须将周期与事件数据集中的其他周期进行比较。这意味着一个事件(DF)与多个期间(Events)之间的重叠天数必须扣除事件数据集中两个(或多个)期间之间的重叠天数

使用以下代码,可以在R中轻松复制我的两个数据源的数据结构示例(请注意,为简单起见,位置变量已设置为整数):

"percent"=>$model->progress

在事件数据简化为一个事件(并且我们不在乎位置)的简单情况下,可以使用以下代码和 { "siteUrl": "http://www.daimto.com/", "permissionLevel": "siteOwner" }, 轻松地计算DF中每个观测的总体天数:来自Matthew Lundberg的答案here的代码,还请注意,我创建了另一个具有单个事件(One_event)的数据框:

        set.seed(1)
    DF <- data.frame(
      start = sample(seq(as.Date('2018-01-01'), as.Date('2018-04-30'), by="day"), 20),
      end = sample(seq(as.Date('2018-05-01'), as.Date('2018-10-30'), by="day"), 20),
      location = sample(seq(1:5)),20)


    Events <- data.frame(
      start = sample(seq(as.Date('2018-01-01'), as.Date('2018-04-30'), by="day"), 30),
      end = sample(seq(as.Date('2018-05-01'), as.Date('2018-10-30'), by="day"), 30),
      location = sample(seq(1:5)),  30 )

导致:

dplyr

现在回到原始的问题。 为了允许比较数据中每个观测的周期以及根据观测和事件的位置匹配的事件,我认为使用library(dplyr) One_event <- data.frame( start = as.Date('2018-01-01'), end = as.Date('2018-07-30')) DF %>% mutate(overlap = pmax(pmin(One_event$end, end) - pmax(One_event$start, start) + 1,0)) 函数是合理的,根据观测位置将事件数据集子集化,最后为每行和事件数据(温度)的子集运行mutate函数:

   start        end       location X20  overlap
1  2018-02-01 2018-10-19        5  20 180 days
2  2018-02-14 2018-06-08        3  20 115 days
3  2018-03-09 2018-08-26        4  20 144 days
4  2018-04-17 2018-05-23        2  20  37 days
5  2018-01-24 2018-06-17        1  20 145 days
6  2018-04-14 2018-07-08        5  20  86 days
7  2018-04-18 2018-05-03        3  20  16 days
8  2018-03-16 2018-07-07        4  20 114 days
9  2018-03-12 2018-09-30        2  20 141 days
10 2018-01-07 2018-06-29        1  20 174 days
11 2018-01-23 2018-07-23        5  20 182 days
12 2018-01-20 2018-08-12        3  20 192 days
13 2018-04-23 2018-07-24        4  20  93 days
14 2018-02-11 2018-06-01        2  20 111 days
15 2018-03-23 2018-09-17        1  20 130 days
16 2018-02-22 2018-08-21        5  20 159 days
17 2018-04-24 2018-09-10        3  20  98 days
18 2018-04-13 2018-05-18        4  20  36 days
19 2018-02-08 2018-08-28        2  20 173 days
20 2018-03-20 2018-10-23        1  20 133 days

最后一部分代码存在一些问题。首先,它不起作用并给出错误消息:

apply

第二,它没有说明事件数据集中两个(或多个)重叠的时间。

1 个答案:

答案 0 :(得分:1)

您在寻找这个吗:

apply(DF, MARGIN = 1, function(x) {
  Events[Events$location == x["location"],] %>% mutate(overlap = pmax(pmin(.data$end,         
  x["end"]) - pmax(.data$start, x["start"])))
})

对于我来说,这导致:

[[1]]
   start        end location X30  overlap
1 2018-02-01 2018-07-28        5  30 177 days
2 2018-04-14 2018-08-27        5  30 135 days
3 2018-01-23 2018-09-20        5  30 231 days
4 2018-02-22 2018-09-10        5  30 200 days
5 2018-04-04 2018-07-17        5  30 104 days
6 2018-02-06 2018-05-16        5  30  99 days

[[2]]
   start        end location X30  overlap
1 2018-01-24 2018-09-26        3  30 114 days
2 2018-01-07 2018-07-11        3  30 114 days
3 2018-03-23 2018-10-28        3  30  77 days
4 2018-03-20 2018-08-22        3  30  80 days
5 2018-01-26 2018-05-12        3  30  87 days
6 2018-01-31 2018-07-02        3  30 114 days

[[3]]
   start        end location X30  overlap
1 2018-03-09 2018-07-29        4  30 142 days
2 2018-03-16 2018-05-19        4  30  64 days
3 2018-04-23 2018-09-11        4  30 125 days
4 2018-04-13 2018-07-19        4  30  97 days
5 2018-03-05 2018-07-10        4  30 123 days
6 2018-02-05 2018-07-20        4  30 133 days

...