列出 R 中日期时间元素的成对重叠
Listing pairwise overlaps of Date time elements in R
我有一个大学课程的讲座列表存储在数据框中。这是一个包含 1000 多行的大型复杂 table。我在示例中使用了简单时间,但这实际上是格式为 %d %b %Y %H:%M 的日期时间。我想我应该能够推断出更复杂的用法。
本质上:
ModuleCode1 ModuleName Lecturer StartTime EndTime Course
11A Hist1 Bob 10:30 12:30 Hist
13A Hist2 Bob 14:30 15:30 Hist
13C Hist3 Steve 11:45 12:45 Hist
15B Hist4 Bob 09:40 10:40 Hist
17B Hist5 Bob 14:00 15:00 Hist
我正在尝试创建一个输出数据框,它确定哪些模块在时间table 以及在什么时候发生冲突。例如:
ModuleCode1 StartTime EndTime ModuleCode2 StartTime EndTime
11A 10:30 12:30 15B 09:40 10:40
11A 10:30 12:30 13C 11:45 12:45
13A 10:30 12:30 17B 14:00 15:00
有很多关于日期时间重叠的问题,但我能找到的问题似乎要么适用于 2 个数据帧,要么我无法理解它们。我遇到过 lubridate 和 IRanges 包,但无法在单个数据框中用日期时间计算出这个特定的实现。看起来好像是普遍有用的东西,而且很可能会有一个我缺少的简单实现。感谢您的帮助。
这是一个sqldf解决方案。当且仅当 a.StartTime > b.EndTime 或 a.EndTime < b.StartTime 时,区间不重叠,因此当此语句的否定为真时,它们确实重叠,因此:
library(sqldf)
sqldf("select a.ModuleCode1, a.StartTime, a.EndTime, b.ModuleCode1, b.StartTime, b.EndTime
from DF a join DF b on a.ModuleCode1 < b.ModuleCode1 and
a.StartTime <= b.EndTime and
a.EndTime >= b.StartTime")
给予:
ModuleCode1 StartTime EndTime ModuleCode1 StartTime EndTime
1 11A 10:30 12:30 13C 11:45 12:45
2 11A 10:30 12:30 15B 09:40 10:40
3 13A 14:30 15:30 17B 14:00 15:00
注意:可重现形式的输入是:
Lines <- "ModuleCode1 ModuleName Lecturer StartTime EndTime Course
11A Hist1 Bob 10:30 12:30 Hist
13A Hist2 Bob 14:30 15:30 Hist
13C Hist3 Steve 11:45 12:45 Hist
15B Hist4 Bob 09:40 10:40 Hist
17B Hist5 Bob 14:00 15:00 Hist"
DF <- read.table(text = Lines, header = TRUE)
我有一个大学课程的讲座列表存储在数据框中。这是一个包含 1000 多行的大型复杂 table。我在示例中使用了简单时间,但这实际上是格式为 %d %b %Y %H:%M 的日期时间。我想我应该能够推断出更复杂的用法。
本质上:
ModuleCode1 ModuleName Lecturer StartTime EndTime Course
11A Hist1 Bob 10:30 12:30 Hist
13A Hist2 Bob 14:30 15:30 Hist
13C Hist3 Steve 11:45 12:45 Hist
15B Hist4 Bob 09:40 10:40 Hist
17B Hist5 Bob 14:00 15:00 Hist
我正在尝试创建一个输出数据框,它确定哪些模块在时间table 以及在什么时候发生冲突。例如:
ModuleCode1 StartTime EndTime ModuleCode2 StartTime EndTime
11A 10:30 12:30 15B 09:40 10:40
11A 10:30 12:30 13C 11:45 12:45
13A 10:30 12:30 17B 14:00 15:00
有很多关于日期时间重叠的问题,但我能找到的问题似乎要么适用于 2 个数据帧,要么我无法理解它们。我遇到过 lubridate 和 IRanges 包,但无法在单个数据框中用日期时间计算出这个特定的实现。看起来好像是普遍有用的东西,而且很可能会有一个我缺少的简单实现。感谢您的帮助。
这是一个sqldf解决方案。当且仅当 a.StartTime > b.EndTime 或 a.EndTime < b.StartTime 时,区间不重叠,因此当此语句的否定为真时,它们确实重叠,因此:
library(sqldf)
sqldf("select a.ModuleCode1, a.StartTime, a.EndTime, b.ModuleCode1, b.StartTime, b.EndTime
from DF a join DF b on a.ModuleCode1 < b.ModuleCode1 and
a.StartTime <= b.EndTime and
a.EndTime >= b.StartTime")
给予:
ModuleCode1 StartTime EndTime ModuleCode1 StartTime EndTime
1 11A 10:30 12:30 13C 11:45 12:45
2 11A 10:30 12:30 15B 09:40 10:40
3 13A 14:30 15:30 17B 14:00 15:00
注意:可重现形式的输入是:
Lines <- "ModuleCode1 ModuleName Lecturer StartTime EndTime Course
11A Hist1 Bob 10:30 12:30 Hist
13A Hist2 Bob 14:30 15:30 Hist
13C Hist3 Steve 11:45 12:45 Hist
15B Hist4 Bob 09:40 10:40 Hist
17B Hist5 Bob 14:00 15:00 Hist"
DF <- read.table(text = Lines, header = TRUE)