首页 > 解决方案 > 给定生存时间,将数据转换为 R 中的长格式

问题描述

考虑以下示例数据集。

*id 代表个人的标识符。

*Surv_time 代表一个人的生存时间

*start 表示测量 zj 的时间。zj 是一个时变协变量。

rm(list=ls()); set.seed(1)
n<-5
Surv_time<-round( runif( n, 12 , 20  ) ) #Survival time
dat<-data.frame(id=1:n, Surv_time )
ntp<- rep(3, n) # three measurements per individual. 
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") #merging dataset
D$zj <- with(D, 0.3*start)
D
   id start Surv_time  zj
1   1     7        14 2.1
2   1    13        14 3.9
3   1    20        14 6.0
4   2     5        15 1.5
5   2    11        15 3.3
6   2    17        15 5.1
7   3     0        17 0.0
8   3     7        17 2.1
9   3    14        17 4.2
10  4     1        19 0.3
11  4     9        19 2.7
12  4    17        19 5.1
13  5     3        14 0.9
14  5    11        14 3.3
15  5    18        14 5.4

我需要一个代码将数据转换为起止格式,其中最后一站是个人的 Surv_time。这个想法是创建开始-停止间隔,其中一个间隔的停止是下一个间隔的开始。我应该结束

  id start    stop  Surv_time  zj 
1   1     7    13     14       2.1    
2   1    13    14     14       3.9   

4   2     5    11     15       1.5    
5   2    11    15     15       3.3   

7   3     0    7      17       0.0    
8   3     7    14     17       2.1    
9   3    14    17     17       4.2   

10  4     1    9      19       0.3    
11  4     9    17     19       2.7    
12  4    17    19     19       5.1   

13  5     3    11     14       0.9    
14  5    11    14     14       3.3   

标签: rdplyrtransformtidyr

解决方案


我们可以使用 dplyr:

library(dplyr)

D %>% group_by(id) %>%
  mutate(stop = lead(start, default = Inf),
         stop = ifelse(stop > Surv_time, Surv_time, stop), .after = start) %>%
  filter(start < stop) %>%
  ungroup()

# A tibble: 12 × 5
      id start  stop Surv_time    zj
   <dbl> <dbl> <dbl>     <dbl> <dbl>
 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  
 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

推荐阅读