首页 > 解决方案 > R:计算已经开始但未结束的事件数 - 如果在日期时间范围内,则计数

问题描述

我有一个具有以下形状的数据集

ID     Start Time             End Time
1   01/01/2017 00:15:00  01/01/2017 07:15:00
2   01/01/2017 04:45:00  01/01/2017 06:15:00
3   01/01/2017 10:20:00  01/01/2017 20:15:00
4   01/01/2017 02:15:00  01/01/2017 00:15:00
5   02/01/2017 15:15:00  03/01/2017 00:30:00
6   03/01/2017 07:00:00  04/01/2017 09:15:00

我想在一整年中每 15 分钟计算一次有多少项目已经开始但尚未完成,所以计算开始时间大于或等于我正在查看的时间且结束时间小于或等于的次数我正在看的时间。

如果可能的话,我正在寻找一种使用 tidyverse/dplyr 的方法。

任何帮助或指导将不胜感激。

标签: rdatedatetimedplyrtidyverse

解决方案


如果我理解正确,OP 想要计算同时活动事件的数量。

解决这个问题的一种可能性是coverage()来自 BioconductorIRange软件包的功能。另一种方法是在包中提供的非 equi 连接中进行聚合data.table

非等连接

# create sequence of datetimes (limited to 4 days for demonstration)
seq15 <- seq(lubridate::as_datetime("2017-01-01"), 
          lubridate::as_datetime("2017-01-05"), by = "15 mins")
# aggregate within a non-equi join
library(data.table)
result <- periods[.(time = seq15), on = .(Start.Time <= time, End.Time > time), 
        .(time, count = sum(!is.na(ID))), by = .EACHI][, .(time, count)]
result
                    time count
  1: 2017-01-01 00:00:00     0
  2: 2017-01-01 00:15:00     1
  3: 2017-01-01 00:30:00     1
  4: 2017-01-01 00:45:00     1
  5: 2017-01-01 01:00:00     1
 ---                          
381: 2017-01-04 23:00:00     0
382: 2017-01-04 23:15:00     0
383: 2017-01-04 23:30:00     0
384: 2017-01-04 23:45:00     0
385: 2017-01-05 00:00:00     0

结果可以以图形方式显示:

library(ggplot2)
ggplot(result) + aes(time, count) + geom_step()

在此处输入图像描述

数据

periods <- readr::read_table(
  "ID     Start.Time             End.Time
1   01/01/2017 00:15:00  01/01/2017 07:15:00
2   01/01/2017 04:45:00  01/01/2017 06:15:00
3   01/01/2017 10:20:00  01/01/2017 20:15:00
4   01/01/2017 02:15:00  01/01/2017 00:15:00
5   02/01/2017 15:15:00  03/01/2017 00:30:00
6   03/01/2017 07:00:00  04/01/2017 09:15:00"
)

# convert date strings to class Date
library(data.table)
cols <- names(periods)[names(periods) %like% "Time$"]
setDT(periods)[, (cols) := lapply(.SD, lubridate::dmy_hms), .SDcols = cols]
periods
   ID          Start.Time            End.Time
1:  1 2017-01-01 00:15:00 2017-01-01 07:15:00
2:  2 2017-01-01 04:45:00 2017-01-01 06:15:00
3:  3 2017-01-01 10:20:00 2017-01-01 20:15:00
4:  4 2017-01-01 02:15:00 2017-01-01 00:15:00
5:  5 2017-01-02 15:15:00 2017-01-03 00:30:00
6:  6 2017-01-03 07:00:00 2017-01-04 09:15:00

推荐阅读