R 向数据帧添加额外的时间点

R 向数据帧添加额外的时间点,r,dataframe,R,Dataframe,我有一个数据框架,包含患者“ID”、“时间”、“DV”、“AMT”、“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

我有一个数据框架,包含患者“ID”、“时间”、“DV”、“AMT”、“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
除了“df”中包含的时间之外,我还需要为每个主题ID添加一个独特的“时间”序列

timeseq在@thelatemail的讨论和评论之后,您可以使用data.table解决方案,因为您声称拥有大量数据集(这将更快):

库(data.table)
图书馆(动物园)

dt这几乎可以肯定是重复的,您只需要根据
ID
TIME
的所有可能组合进行合并-例如:
merge(df,expand.grid(ID=unique(df$ID),TIME=timeseq),by=c(“ID”,“TIME”),all=TRUE)
@thelatemail谢谢。但是,这为其他列提供了一个
NA
!根据你的要求看我的答案。非常感谢。locf的代码给了我一个错误:gg[!TIME etc
中的错误:
意外']'。这行代码缺少什么吗@user227710@Amer:它运行时没有错误。可能是您复制粘贴错误。每个打开的
[
都会有关闭的
]
。我把它写得一模一样。奇怪的是,它没有和我一起工作。我的数据中有许多其他列,但我认为这与这些无关?你能复制并粘贴代码吗?我会检查发生了什么。不管你有多少列。是的。
df
timeseq <- c(seq(0.05,5,by=0.1))
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))