我有一个数据框,有病人" ID","时间"," DV"," AMT",&#34 ; EVID:事件ID"," MDV:缺少DV"和几个患者协变量如下。
df
ID TIME DV AMT MDV EVID WT SEX
9010 0 NA 50 1 1 70 0
9010 0.5 0.2 0 0 0 70 0
9010 1 5 0 0 0 70 0
9010 5 10 0 0 0 70 0
9011 0 NA 50 1 1 60 1
9011 1 4 0 0 0 60 1
9011 3 6 0 0 0 60 1
9011 6 10 0 0 0 60 1
我需要添加唯一" TIME"除了" df"。
中包含的时间之外,每个主题ID的顺序timeseq <- c(seq(0.05,5,by=0.1))
对于添加时间的行,&#34; DV = NA; AMT = 0; MDV = 0; EVID = 0&#34 ;. &#34; ID; WT; SEX&#34;应该保持不变。
我需要帮助来了解如何使用R将这些额外的时间点添加到我的数据框中。我有庞大的数据集,并且主题之间的采样时间点不同。
答案 0 :(得分:2)
在讨论here和@thelatemail的评论后,您可以使用data.table解决方案,因为您声称拥有一个庞大的集合(这会更快):
library(data.table)
library(zoo) #na.locf
dt<-as.data.table(df)
index<-CJ(ID=unique(dt$ID),TIME=timeseq)
gg<-merge(dt,index,by=c("ID","TIME"),all=TRUE)
gg[!TIME %in% dt$TIME, `:=`(AMT=0,MDV=0,EVID=0)][,`:=`(WT=na.locf(WT),SEX=na.locf(SEX)),by=ID]
ID TIME DV AMT MDV EVID WT SEX
1: 9010 0.00 NA 50 1 1 70 0
2: 9010 0.05 NA 0 0 0 70 0
3: 9010 0.15 NA 0 0 0 70 0
4: 9010 0.25 NA 0 0 0 70 0
5: 9010 0.35 NA 0 0 0 70 0
---
104: 9011 4.65 NA 0 0 0 60 1
105: 9011 4.75 NA 0 0 0 60 1
106: 9011 4.85 NA 0 0 0 60 1
107: 9011 4.95 NA 0 0 0 60 1
108: 9011 6.00 10 0 0 0 60 1
df<-structure(list(ID = c(9010L, 9010L, 9010L, 9010L, 9011L, 9011L,
9011L, 9011L), TIME = c(0, 0.5, 1, 5, 0, 1, 3, 6), DV = c(NA,
0.2, 5, 10, NA, 4, 6, 10), AMT = c(50L, 0L, 0L, 0L, 50L, 0L,
0L, 0L), MDV = c(1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L), EVID = c(1L,
0L, 0L, 0L, 1L, 0L, 0L, 0L), WT = c(70L, 70L, 70L, 70L, 60L,
60L, 60L, 60L), SEX = c(0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L)), .Names = c("ID",
"TIME", "DV", "AMT", "MDV", "EVID", "WT", "SEX"), class = "data.frame", row.names = c(NA,
-8L))