2016-12-14 4 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 dataframe или 2 dataframes. Вы можете объединить файл данных с собой, используя 'sqldf' или' foverlaps() 'в библиотеке' data.table'. – 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

Смежные вопросы