2017-12-19 23 views
1

データセットdfの行をマージして、各レコードIDに対して行のEnd_Dateが次の行のStart_Dateと等しい場合、それらを組み合わせるのが好きです。2つのdatetime変数に基づいて行をマージする方法

私が考えている現在の論理は、最初にIDでグループ化してから、行1から行n()にループすることです。行1のEnd_Dateが行2のStart_Dateに等しい場合、行1のEnd_Dateを行2のEnd_Dateに置き換え、行2を削除します。次に行1を新しい行2と比較します。

これについてのコードを書く方法については、本当に助けてください。ありがとうございました!

df <- read.table(text = " 
ID Start_Date End_Date 
1 09/09/2016 11/09/2016 
1 11/09/2016 17/09/2016 
1 17/09/2016 23/11/2016 
1 23/11/2016 28/11/2016 
1 28/11/2016 14/12/2016 
1 14/12/2016 22/12/2016 
1 22/12/2016 23/12/2016 
1 25/12/2016 03/01/2017 
1 06/01/2017 07/02/2017 
1 07/02/2017 22/02/2017 
1 22/02/2017 27/02/2017 
1 28/03/2017 30/05/2017 
1 12/06/2017 03/07/2017 
1 03/07/2017 04/07/2017 
1 14/08/2017 14/08/2017 
1 15/08/2017 23/08/2017 
1 23/08/2017 24/08/2017 
1 24/08/2017 28/08/2017 
1 07/09/2017 07/09/2017 
1 24/09/2017 24/09/2017 
1 01/10/2017 08/11/2017 
1 08/11/2017 31/12/2017 
2 08/08/2017 10/08/2017 
2 10/08/2017 11/08/2017", stringsAsFactors = FALSE, header = TRUE) 

出力データは次のようになります。私は何が起こっている検査する行で、この行を実行することをお勧め

df %>% 
    mutate(collapse = Start_Date == lag(End_Date), 
     group = cumsum(c(0, tail(!collapse, -1)))) %>% 
    group_by(group) %>% 
    summarise(Start_Date = first(Start_Date), 
      End_Date = last(End_Date)) %>% 
    select(Start_Date, End_Date) 

df_new <- read.table(text = " 
ID Start_Date End_Date 
1 09/09/2016 23/12/2016 
1 25/12/2016 03/01/2017 
1 06/01/2017 27/02/2017 
1 28/03/2017 30/05/2017 
1 12/06/2017 04/07/2017 
1 14/08/2017 14/08/2017 
1 15/08/2017 28/08/2017 
1 07/09/2017 07/09/2017 
1 24/09/2017 24/09/2017 
1 01/10/2017 31/12/2017 
2 08/08/2017 11/08/2017", stringsAsFactors = FALSE, header = TRUE) 
+1

[範囲が重複する行を折りたたむ](https://stackoverflow.com/questions/41747742/collapse-rows-with-overlapping-ranges)とその中のリンクはあなたを動かすことができます。 – Henrik

答えて

0

ここdplyrソリューションです!

最初に、新しい列コラプスが作成されます。これは、レコードの開始日が前のレコードの終了日と等しい場合にtrueになります。最初の行には前のレコードがないので、行番号1にNAが表示されます。

次に、新しいグループ列が作成されますが、崩壊列の累積合計は行1はトリムされ、0に置き換えられます。折り返しは無効にする必要があります。なぜなら、マージしない行に遭遇したときに値をインクリメントしたいからです。

最後に、グループの列で簡単なグループを作成して要約することができます。私はこの場合にID列を無視しました。

(これはまた、データがうまく整理され、日付範囲の重複が心配されていないことを前提としています)。

関連する問題