2016-12-14 60 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