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つのデータフレームで動作するか、または私はそれを理解できないようです。私はlubridateとIRangesのパッケージを見てきましたが、この特定の実装を単一のデータフレームで日付の時間に動かすことはできません。それは一般的に有用なもののように思えますが、単純に実装が失われている可能性が最も高くなります。助けに感謝します。

+0

データフレーム又はデータフレーム2 between1違いはありません。 'data.table'ライブラリの' sqldf'や 'foverlaps()'を使ってデータフレームをマージすることができます。 – Xinlu

答えて

1

ここにsqldfソリューションがあります。

与える
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 
をこの文の否定が故に、真であるとき、彼らは正確に重複しないように、間隔がIFF a.StartTime> b.EndTimeまたはa.EndTime < b.StartTimeを重なりません

注:再現可能な形で入力される:

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

関連する問題