我有一个存储在数据框架中的大学课程讲座列表。这是一个超过1000行的大型复杂表。我在示例中使用了简单的时间,但这实际上是格式为%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
我正在尝试创建一个输出数据框,用于确定哪些模块在时间表和哪些时间发生冲突。例如:
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包,但无法在单个数据框中使用日期时间来解决这个特定的实现。看起来似乎通常有用的东西,并且很可能会有一个我想念的简单实现。感谢任何帮助。
答案 0 :(得分:1)
这是一个sqldf解决方案。如果a 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)