#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