Преобразуйте данные в длинный формат за заданное время выживания

#r #dplyr #transform #tidyr

Вопрос:

Рассмотрим следующий пример набора данных.

*идентификатор представляет идентификатор физического лица.

*Surv_time представляет время выживания индивида

*начало представляет время, в которое измеряется zj. zj-изменяющаяся во времени ковариата.

 rm(list=ls()); set.seed(1) nlt;-5 Surv_timelt;-round( runif( n, 12 , 20 ) ) #Survival time datlt;-data.frame(id=1:n, Surv_time ) ntplt;- rep(3, n) # three measurements per individual.  matlt;-matrix(ncol=2,nrow=1) m=0; w lt;- mat for(l in ntp) {  m=m 1  ftlt;- seq(from = runif(1,0,8), to = runif(1,12,20) , length.out = l)  seqlt;-round(ft)  matidlt;-cbind( matrix(seq,ncol=1 ) ,m)  wlt;-rbind(w,matid) }  dlt;-data.frame(w[-1,]) colnames(d)lt;-c("start","id") D lt;- merge(d,dat,by="id") #merging dataset D$zj lt;- 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  

Мне нужен код для преобразования данных в формат start-stop, где последняя остановка для отдельного человека происходит во время 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   

Комментарии:

1. пожалуйста, поделитесь кодом с вашими данными с dput(data)

Ответ №1:

Мы можем использовать dplyr:

 library(dplyr)  D %gt;% group_by(id) %gt;%  mutate(stop = lead(start, default = Inf),  stop = ifelse(stop gt; Surv_time, Surv_time, stop), .after = start) %gt;%  filter(start lt; stop) %gt;%  ungroup()  # A tibble: 12 × 5  id start stop Surv_time zj  lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt;  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  

Ответ №2:

Возможно, это не самое элегантное решение, но оно должно сработать

 library(tidyverse)  D lt;- D %gt;%   mutate(stop = c(start[2:nrow(D)],NA)) %gt;%   filter(startlt;=Surv_time)  D$stop[D$stop gt; D$Surv_time |D$stop lt; D$start] lt;- D$Surv_time[D$stop gt; D$Surv_time|D$stop lt; D$start]  D lt;- D %gt;% select(id, start, stop, Surv_time, zj)