#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)