列出 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)