You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:06:00