【问题标题】:Adding extra time points to data frame向数据框添加额外的时间点
【发布时间】:2015-07-06 02:18:53
【问题描述】:

我有一个数据框,其中包含患者“ID”、“TIME”、“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 添加一个唯一“TIME”序列。

timeseq <- c(seq(0.05,5,by=0.1))

对于添加时间的行,“DV=NA;AMT=0;MDV=0;EVID=0”。 “ID ; WT; SEX”应该保持不变。

我需要有关如何使用 R 将这些额外时间点添加到我的数据框的帮助。我有庞大的数据集,并且不同主题的采样时间点不同。

【问题讨论】:

  • 这几乎可以肯定是重复的,您只需要合并IDTIME 的所有可能组合 - 例如:merge(df,expand.grid(ID=unique(df$ID),TIME=timeseq),by=c("ID","TIME"),all=TRUE)
  • @thelatemail 谢谢。但是,这会为其他列提供NA
  • 根据您的要求查看我的答案。

标签: r dataframe


【解决方案1】:

根据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))

【讨论】:

  • 非常感谢。 locf 的代码给了我一个错误:错误:unexpected ']' in gg[!TIME etc。这行代码是否缺少某些内容? @user227710
  • @Amer:它运行没有错误。可能是您错误地复制粘贴。每个开头[ 都会关闭]
  • 我写的完全一样。奇怪的是它不适合我。我的数据中有很多其他列,但我认为这与这些无关?
  • 你能把代码复制粘贴到这里吗?我会检查发生了什么。不管你有多少列。
  • 是的。 df &lt;- gg[!TAD%in%ORG.data$TAD,:=(AMT=0,MDV=0,EVID=0)][,:=(WEIGHT=na.locf(WEIGHT),by=ID2]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 2015-01-15
  • 2013-10-22
  • 2018-01-19
  • 1970-01-01
相关资源
最近更新 更多