r - 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 的方法。
任何帮助或指导将不胜感激。
解决方案
如果我理解正确,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
推荐阅读
- php - 如何将 Laravel 通知与我的网站集成?
- data-structures - 如何识别树的叶子?
- python - 多目标固定大小子集优化
- python - 无 从 cv2 输入 PyQt5
- mysql - 按列分组并按一列排序
- sql-server - MS SQL Server 中 sys.tables 中的 is_node 和 is_edge 列
- ios - 来自 Socket.io 的 UILabel.text 更新不同步
- java - 如何使用 java 8 和流将属性值从列表第一个元素传播到所有列表元素?
- android - 在 Android 中在蜂窝网络和 WiFi 网络之间切换
- hornetq - 如何拒绝大于 100 MB HornetQ 的消息