長い形式の巨大なデータ ファイルがあります。その一部を以下に示します。各 ID には複数の行を含めることができ、status は最終的なステータスです。ただし、時変共変量を使用して分析を行う必要があるため、2 つの新しい時間変数を作成し、状態変数を更新する必要があります。私はこれにしばらく苦労してきました.IDごとに最大4行ある可能性があるため、これを効率的に行う方法がわかりません. 時変変数はNUM.AFTER.DIAG
です。それならNUM.AFTER.DIAG==0
簡単で、どこでtime1=0
、time2=STATUSDATE
. ただしNUM.AFTER.DIAG==1
、新しい行を作成する必要がある場合は、どこtime1=0
に、time2=DOB-DATE.DIAG
そしてNUM.AFTER.DIAG=0
確認する必要がありSTATUS="B"
ます。2 番目の行はtime1=time2
前の行から取得され、time2=STATUSDATE-DATE.DIAG-time1
この列から。同様に、さらに行がある場合は、異なる行を互いに減算する必要があります。また、NUM.AFTER.DIAG==0 でも複数の行がある場合は、余分な行をすべて削除できます。
これに対する効率的な解決策のアイデアはありますか? ジョン・フォックスの展開コマンドを見てきましたが、すべての間隔が最初からワイド形式であると想定しています。
編集:要求されたテーブル。センサー変数については、「D」=イベント (死亡)
structure(list(ID = c(187L, 258L, 265L, 278L, 281L, 281L, 283L,
283L, 284L, 291L, 292L, 292L, 297L, 299L, 305L, 305L, 311L, 311L,
319L, 319L, 319L, 322L, 322L, 329L, 329L, 333L, 333L, 333L, 334L,
334L), STATUS = c("D", "B", "B", "B", "B", "B", "D", "D", "B",
"B", "B", "B", "D", "D", "D", "D", "B", "B", "B", "B", "B", "D",
"D", "B", "B", "D", "D", "D", "D", "D"), STATUSDATE = structure(c(11153,
15034, 15034, 15034, 15034, 15034, 5005, 5005, 15034, 15034,
15034, 15034, 6374, 5005, 7562, 7562, 15034, 15034, 15034, 15034,
15034, 7743, 7743, 15034, 15034, 4670, 4670, 4670, 5218, 5218
), class = "Date"), DATE.DIAG = structure(c(4578, 4609, 4578,
4487, 4670, 4670, 4517, 4517, 4640, 4213, 4397, 4397, 4397, 4487,
4213, 4213, 4731, 4731, 4701, 4701, 4701, 4397, 4397, 4578, 4578,
4275, 4275, 4275, 4456, 4456), class = "Date"), DOB = structure(c(NA,
13010, NA, NA, -1082, -626, 73, 1353, 13679, NA, 1626, 3087,
-626, -200, 2814, 3757, 1930, 3787, 6740, 13528, 14167, 5462,
6557, 7865, 9235, -901, -504, -108, -535, -78), class = "Date"),
NUM.AFTER.DIAG = c(0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 2, 3, 1, 2, 1, 2, 0, 0, 0, 0, 0)), .Names = c("ID",
"STATUS", "STATUSDATE", "DATE.DIAG", "DOB", "NUM.AFTER.DIAG"), row.names = c(NA,
30L), class = "data.frame")
編集:おそらくあまり効率的ではありませんが、解決策を思いつきました。
u1<-ddply(p,.(ID),function(x) {
if (x$NUM.AFTER.DIAG==0){
x$time1<-0
x$time2<-x$STATUSDATE-x$DATE.DIAG
x<-x[1,]
}
else {
x<-rbind(x,x[1,])
x<-x[order(x$DOB),]
u<-max(x$NUM.AFTER.DIAG)
x$NUM.AFTER.DIAG<-0:u
x$time1[1]<-0
x$time2[1:(u)]<-x$DOB[2:(u+1)]-x$DATE.DIAG[2:(u+1)]
x$time2[u+1]<-x$STATUSDATE[u]-x$DATE.DIAG[u]
x$time1[2:(u+1)]<-x$time2[1:u]
x$STATUS[1:u]<-"B"
}
x
}
)