2016-12-14 69 views
0

我有一个存储在数据框架中的大学课程讲义列表。这是一个超过1000行的大型复杂表格。我在示例中使用了简单的时间,但这实际上是日期时间,格式为%d%b%Y%H:%M。我想我应该能够推断出更复杂的用法。列出R中日期时间元素的成对重叠

基本上:

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个dataframes工作,否则我无法理解他们。我遇到了lubridate和IRanges软件包,但无法用日期时间在单个数据框中计算出具体的实现。看起来好像有些东西通常很有用,而且很可能会有一个简单的实现。感谢任何帮助。

+0

有between1数据帧或2 dataframes没有差别。您可以使用'data.table'库中的'sqldf'或'foverlaps()'来合并数据框。 – Xinlu

回答

1

这是一个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) 
+0

绝对的辉煌!我不知道这个辉煌的软件包存在使用SQL。非常感谢,这将帮助我解决一系列问题。 – crazylearner