列出R

时间:2016-12-14 02:34:56

标签: r datetime intervals

我有一个存储在数据框架中的大学课程讲座列表。这是一个超过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包,但无法在单个数据框中使用日期时间来解决这个特定的实现。看起来似乎通常有用的东西,并且很可能会有一个我想念的简单实现。感谢任何帮助。

1 个答案:

答案 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)