2017-08-08 9 views
1

私はいくつかの時間から私が頭痛を与える時間間隔で働く問題を解決しようとしています。複数の行にわたる時間間隔

これは2つのIDの薬物処方の例です。

df <- data.frame('ID' = c('1','1','1','1','2','2'), 'start' = c('2010-01-01', '2010-01-03', '2010-01-05', '2010-01-09','2010-02-01', '2010-02-10'), 
      'end' = c('2010-01-03', '2010-01-22', '2010-01-07', '2010-01-12', '2010-02-10', '2010-02-12')) 

    ID  start  end 
1 1 2010-01-01 2010-01-03 
2 1 2010-01-03 2010-01-22 
3 1 2010-01-05 2010-01-07 
4 1 2010-01-09 2010-01-12 
5 2 2010-02-01 2010-02-10 
6 2 2010-02-10 2010-02-12 

目的は、継続的な薬物使用を示す新しい列を作成することです。したがって、この例では、両方のIDが継続的に使用されます(処方の終了と次の処方の開始の間の最大間隔= 1日)。最終的な結果は次のようになります(連続使用を示すために論理的):

ID  start  end continuous 
1 1 2010-01-01 2010-01-03 FALSE 
2 1 2010-01-03 2010-01-22 TRUE 
3 1 2010-01-05 2010-01-07 TRUE 
4 1 2010-01-09 2010-01-12 TRUE 
5 2 2010-02-01 2010-02-10 FALSE 
6 2 2010-02-10 2010-02-12 TRUE 

それがために連続していないとして、私はdplyrとlubridateでこれを解決しようとしたが、4行目のために正しい結果を得るために管理していませんでした行3の行2行です。ここに私のコードです:

私は本当にこれにいくつかの助けに感謝します!どうも!

答えて

0

データフレームをIDでグループ分けし、別の行の先頭と最後の間に開始点がある場合は、各行をチェックします。

データ(それはいつもので、TRUEsum(..)>1場合を返し、自身の開始と終了の間にある):

df <- data.frame('ID' = c('1','1','1','1','2','2'), 'start' = c('2010-01-01', '2010-01-03', '2010-01-05', '2010-01-09','2010-02-01', '2010-02-10'), 
       'end' = c('2010-01-03', '2010-01-22', '2010-01-07', '2010-01-12', '2010-02-10', '2010-02-12'),stringsAsFactors = F) 
df$start = as.Date(df$start) 
df$end = as.Date(df$end) 

コード:

df$continuous = unlist(lapply(split(df,df$ID), function(x) {lapply(1:nrow(x), 
      function(y) { sum(x$start[y]>=x$start & x$start[y] <= x$end + 1) })>1 })) 

出力:

ID  start  end continuous 
1 1 2010-01-01 2010-01-03  FALSE 
2 1 2010-01-03 2010-01-22  TRUE 
3 1 2010-01-05 2010-01-07  TRUE 
4 1 2010-01-09 2010-01-12  TRUE 
5 2 2010-02-01 2010-02-10  FALSE 
6 2 2010-02-10 2010-02-12  TRUE 

これが役立つことを願っています!

+0

私は混乱し、私の答えを削除しました。このデータフレームでソリューションを実行してみてください。 'df1 < - rbind(data.frame(ID = 1、start = as.POSIXct(c( '2010-02-03'、 '2010-02-05')、format = '%Y-%m-%d')、end = as.POSIXct(c( '2010-02-04'、 '2010-02-06')、format = '%Y-%m-%d') 、stringsAsFactors = F)、df [df $ ID == 2]] 'は期待された結果ですか? – Sotos

+0

すばらしい!ありがとうフロリアン! – ceefel

+0

@Sotos、あなたは正しいです、頭のおかげで。私は1日のギャップを含めることを忘れて、私は私の答えを更新します。 – Florian

関連する問題