R语言带时依协变量的生存数据转换为start-stop长格式实现方法
R语言时依协变量start-stop生存数据格式转换
字段说明
id:个体标识符Surv_time:个体生存时间start:时依协变量zj的测量时间
样本数据集生成代码
rm(list=ls()); set.seed(1) n<-5 Surv_time<-round( runif( n, 12 , 20 ) ) #生存时间 dat<-data.frame(id=1:n, Surv_time ) ntp<- rep(3, n) #每个个体3次测量 mat<-matrix(ncol=2,nrow=1) m=0; w <- mat for(l in ntp) { m=m+1 ft<- seq(from = runif(1,0,8), to = runif(1,12,20) , length.out = l) seq<-round(ft) matid<-cbind( matrix(seq,ncol=1 ) ,m) w<-rbind(w,matid) } d<-data.frame(w[-1,]) colnames(d)<-c("start","id") D <- merge(d,dat,by="id") #合并数据集 D$zj <- with(D, 0.3*start)
格式转换代码
tidyverse实现版本
library(dplyr) result <- D %>% group_by(id) %>% # 过滤测量时间晚于生存时间的无效行 filter(start < Surv_time) %>% # 生成stop列:前n-1行stop为下一行的start,最后一行stop为个体生存时间 mutate(stop = lead(start, default = first(Surv_time))) %>% ungroup() %>% # 调整列输出顺序 select(id, start, stop, Surv_time, zj)
基础R实现版本
result <- do.call(rbind, lapply(split(D, D$id), function(subdat) { # 过滤无效行 subdat <- subdat[subdat$start < subdat$Surv_time, ] n <- nrow(subdat) if(n == 0) return(NULL) # 生成stop列 subdat$stop <- c(subdat$start[2:n], subdat$Surv_time[1]) # 调整列顺序 subdat[, c("id", "start", "stop", "Surv_time", "zj")] })) rownames(result) <- NULL
输出结果
id start stop Surv_time zj 1 1 7 13 14 2.1 2 1 13 14 14 3.9 3 2 5 11 15 1.5 4 2 11 15 15 3.3 5 3 0 7 17 0.0 6 3 7 14 17 2.1 7 3 14 17 17 4.2 8 4 1 9 19 0.3 9 4 9 17 19 2.7 10 4 17 19 19 5.1 11 5 3 11 14 0.9 12 5 11 14 14 3.3
内容的提问来源于stack exchange,提问作者John Majimboni
相关产品推荐
相关产品推荐

