R 向数据帧添加额外的时间点
我有一个数据框架,包含患者“ID”、“时间”、“DV”、“AMT”、“EVID:事件ID”、“MDV:缺失DV”和几个患者协变量,如下所示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
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))