我有一個長格式的巨大數據文件 - 下面提供了它的一部分。每個ID可以有多行,其中狀態是最終狀態。不過,我需要用時變協變量來進行分析,因此需要創建兩個新的時間變量並更新狀態變量。我一直在爲此掙扎一段時間,我無法弄清楚如何有效地做到這一點,因爲每個ID最多可以有四行。時變變量是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"
。第二行然後是來自該行的前一行time1=time2
和來自該行的time2=STATUSDATE-DATE.DIAG-time1
。同樣,如果有更多的行,那麼不同的行需要相互減去。另外,如果NUM.AFTER.DIAG == 0但有多行,則可以刪除所有額外的行。用於在r中創建時變協變量的工作流程
有效解決此問題的任何想法? 我看過約翰福克斯展開命令,但它假定所有的時間間隔都是以寬格式開始的。
編輯:根據要求的表格。至於御史變量:「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
}
)
你能否提供一個例子(以表格的形式)說明你的數據在轉換之後的樣子應該是什麼樣子,比方說ID 258,299,319和333?你的STATUS變量指示了什麼? 'B' =事件,'D' =審查? – adibender
您是否已經有解決方案並希望使其更有效率,或者您是否知道如何針對每個人分別執行此操作,但是難以將其應用於所有個人? - 感謝編輯btw – adibender
我確實找到了一個解決方案,剛纔使用plyr和rbind來添加所需的額外列......我將它添加並留給某人找到更有效的方法.. – Misha