Создание переменной начала события

#r #bioinformatics

#r #биоинформатика

Вопрос:

У меня есть клинические данные, которые регистрируют пациента в три временных момента с исходом заболевания, обозначенным двоичной переменной. Это выглядит примерно так

 patientid <- c(100,100,100,101,101,101,102,102,102)
time <- c(1,2,3,1,2,3,1,2,3)
outcome <- c(0,1,1,0,0,1,1,1,0) 

Data<- data.frame(patientid=patientid,time=time,outcome=outcome)
Data
  

Я хочу создать переменную начала, чтобы для каждого пациента она кодировала 1 для времени, когда пациент впервые заболел, но затем была бы равна 0 для любого периода времени до или после (даже если у этого пациента все еще была болезнь). Для примера данных теперь это должно выглядеть так.

 patientid <- c(100,100,100,101,101,101,102,102,102)
time <- c(1,2,3,1,2,3,1,2,3)
outcome <- c(0,1,1,0,0,1,1,1,0) 
outcome_onset <- c(0,1,0,0,0,1,1,0,0)

Data<- data.frame(patientid=patientid,time=time,outcome=outcome, 
outcome_onset=outcome_onset)
Data
  

Поэтому я хотел бы получить некоторый код / некоторую помощь, автоматизирующую создание переменной outcome_onset.

Ответ №1:

Вот вариант с cumsum созданием логического вектора после группировки по ‘patientid’

 library(dplyr)
Data %>% 
   group_by(patientid) %>%
   mutate(outcome_onset =  (cumsum(outcome) == 1))
  

Или использовать match и %in%

 Data %>%
   group_by(patientid) %>% 
   mutate(outcome_onset =  (row_number() %in% match(1, outcome_onset)))
  

Ответ №2:

Мы можем использовать which.max , чтобы получить индекс 1-й outcome переменной и сделать эту строку равной 1, а остальные — 0.

 library(dplyr)

Data %>%
  group_by(patientid) %>%
  mutate(outcome_onset = as.integer(row_number() %in% which.max(outcome)), 
         outcome_onset = replace(outcome_onset, is.na(outcome), NA))

#  patientid  time outcome outcome_onset
#      <dbl> <dbl>   <dbl>         <int>
#1       100     1       0             0
#2       100     2       1             1
#3       100     3       1             0
#4       101     1       0             0
#5       101     2       0             0
#6       101     3       1             1
#7       102     1       1             1
#8       102     2       1             0
#9       102     3       0             0
  

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

1. Есть ли способ учесть недостающие данные в столбце результатов… Я продолжаю получать следующее предупреждение «количество строк результата не кратно длине вектора (аргумент 1)»

2. @BenjaminKrick Вы уверены, что копируете код правильно и в новом сеансе R. Этот ответ не должен оказывать никакого влияния NA на значения.

3. вы правы, ваш код действительно работает. Пытаюсь сохранить n / a. Например, если в результате есть n / a, то он остается n / a в начале результата

4. Смотрите Обновленный ответ, который будет сделан NA , outcome_onset если outcome есть NA .

5. есть ли способ адаптировать этот код так, чтобы индекс 1-го в переменной результата и сделать эту строку равной 1, а остальные — NA