为数据框添加额外的时间点

时间:2015-07-06 02:18:54

标签: r dataframe

我有一个数据框,有病人" 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将这些额外的时间点添加到我的数据框中。我有庞大的数据集,并且主题之间的采样时间点不同。

1 个答案:

答案 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))