2017-06-12 13 views
1

私は2015年に緊急部門(ED)を訪れた患者の再入院率を30日間と180日間の両方で計算しようとしていますが、どうすればいいのかよく分かりません。再入院率の計算

マイデータフレームは、このようなものになります。

Visit # |Patient # | Admission Date | Discharge date 
    1  1   2015/01/01  2015/01/02 
    2  2   2015/01/01  2015/01/01   
    3  3   2015/01/01  2015/01/02 
    4  1   2015/01/09  2015/01/09          
    5  2   2015/04/01  2015/04/05 
    6  1   2015/05/01  2015/05/01 

を私はバイナリ変数[0,1]を持つ2つの追加の列を持つように期待していた患者は30日、および/または60日以内に再入院したかどうかを示します。 上記の例では、患者1はEDに3回、1月に2回、5月にもう一度来るので、私はreadmit30 = 1とreadmit180 = 1を期待します。患者2は1月に1回、 4月、これreadmit30 = 0とreadmit60 = 1 のサンプル溶液:

Visit # |Patient #| Admission Date | Discharge date | readmit30 | readmit180 
    1  1  2015/01/01  2015/01/02  1   1 
    2  2  2015/01/01  2015/01/01  0   1 
    3  3  2015/01/01  2015/01/02  0   0 
    4  1  2015/01/09  2015/01/09  1   1        
    5  2  2015/04/01  2015/04/05  0   1 
    6  1  2015/05/01  2015/05/01  1   1 

私のデータセットは、約1500人の患者では約2000の訪問を持っている... すべてのヘルプは高く評価されます。

ありがとうございました!

+0

ようこそ。再現可能なデータセットがこの問題に非常に役立ちます。新しい入院日が古い退院日の30日または60日以内にある患者IDと入場日について、自発的に自己参加を求めているようです。これは 'data.table'で行うのはかなり簡単ですが、基底Rのオプションはおそらく行をループする必要があります。 – C8H10N4O2

+0

あなたは 'Readmit180'を意味しますか?もともと180日の再送信を依頼してから、60日間の再送信を参照してください。 – akash87

+0

私はreadmit180を意味した、私はちょうど私の最初の問題を編集しました。ありがとう –

答えて

1

私は実際にこれをかなり行います。私が見つけた最良の方法はdata.tableです。そして、のは、あなたのデータはdsとして保存されているとしましょう:

s <- read.table(text = "Visit Patient Admission Discharge 
1 1 2015/01/01 2015/01/02 
2 2 2015/01/01 2015/01/01   
3 3 2015/01/01 2015/01/02 
4 1 2015/01/09 2015/01/09          
5 2 2015/04/01 2015/04/05 
6 1 2015/05/01 2015/05/01", header = T, sep = "") 

s$Admission <- as.POSIXct(s$Admission, format = "%Y/%m/%d") 
s$Discharge <- as.POSIXct(s$Discharge, format = "%Y/%m/%d") 

ds <- data.table(s) 

setkey(ds, Patient, Admission) 
ds <- ds[ , Daydiff := as.numeric(difftime(shift(Admission, n = 1L, fill = 999, type = "lead"), Discharge)), 
      by = "Patient"][ ,':='(Readmit30 = ifelse(abs(Daydiff) <= 30, 1, 0), 
           Readmit180= ifelse(abs(Daydiff) <= 180, 1, 0), 
           Daydiff = NULL)] 

これは、しかし心に留めておいてください

> ds 
    Visit Patient Admission Discharge  Daydiff Readmit30 Readmit180 
1:  1  1 2015-01-01 2015-01-02  7.00000   1   1 
2:  4  1 2015-01-09 2015-01-09 111.95833   0   1 
3:  6  1 2015-05-01 2015-05-01 -16556.15510   0   0 
4:  2  2 2015-01-01 2015-01-01  89.95833   0   1 
5:  5  2 2015-04-01 2015-04-05 -16530.15510   0   0 
6:  3  3 2015-01-01 2015-01-02 -16437.19677   0   0 

になり、これが唯一のレコードは、その後の30日または180日readmitを持っているかを判断します実際には30日間または180日間の再送信ではありません。

+0

@ akash87ありがとうございます、あなたのコードは、私が必要としたものです。時間を割いていただきありがとうございます –