Продольные данные: Попытка установить, есть ли у пациентов контрольное посещение - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь проанализировать продольные данные. Каждый предмет приходил на наше изучение как минимум один раз и до 3 раз. Мне нужно сделать сравнение оценок за посещение, чтобы увидеть, помогло ли их лечение уменьшить симптомы.

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

Один столбец, указывающий, пришел ли субъект на повторное посещение, и другой столбец, который указывает,субъект вернулся во время своего 3-го посещения

Как выглядит мой набор данных

visit_id  subject_id   visit_number   Measure1    Measure2 ...
1         Subject1         1
2         Subject2         1
3         Subject1         2
4         Subject3         1
5         Subject1         3

Как я пытался кодировать

Использование sapply для циклического просмотра всех посещений по идентификатору субъекта иЗаполните столбцы, если у этого субъекта 2-е посещение и если у него 3-е посещение.

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

sapply(dat$subject_id, function(x) {

if(dat$visit_number == 2) {followup2 <- "yes"
}else {followup2 <- "no"}

if(dat$visit_number == 3) {followup3 <- "yes"
}else {followup3 <- "no"}
})

Как я хочу, чтобы мой набор данных выглядел как

visit_id  subject_id   visit_number     followup2  followup3
1         Subject1         1            yes         yes
3         Subject1         2            yes         yes
5         Subject1         3            yes         yes
2         Subject2         1            yes         no
6         Subject2         2            yes         no
4         Subject3         1            no          no

Я намерен использовать аналогичную логикупройти через каждый предмет и сравнить их симптомы по посещениям. Сравнение посещений 1 и 2, а затем сравнение посещений 2 и 3.

Данные

dat <- read.table(header = TRUE, stringsAsFactors = FALSE,
text = "visit_id  subject_id   visit_number
1         Subject1         1
3         Subject1         2
5         Subject1         3
2         Subject2         1
6         Subject2         2
4         Subject3         1")

Ответы [ 2 ]

1 голос
/ 29 октября 2019

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

dat <- read.table(header = TRUE, stringsAsFactors = FALSE,
text = "visit_id  subject_id   visit_number
1         Subject1         1
3         Subject1         2
5         Subject1         3
2         Subject2         1
6         Subject2         2
4         Subject3         1")

Эта функция будет разделять visit на каждый уникальныйid и посмотрите, больше ли visit больше, чем num

f <- function(id, visit, num) {
  ave(visit, id, FUN = function(x) if (max(x) >= num) 'yes' else 'no')
}

Сделайте несколько тестов, чтобы убедиться, что он работает

with(dat, f(subject_id, visit_number, 1))
# [1] "yes" "yes" "yes" "yes" "yes" "yes"
with(dat, f(subject_id, visit_number, 2))
# [1] "yes" "yes" "yes" "yes" "yes" "no" 
with(dat, f(subject_id, visit_number, 3))
# [1] "yes" "yes" "yes" "no"  "no"  "no" 

Затем решите, что вам нужнозациклить. Вы также можете назначить новые столбцы в вашем фрейме данных для каждой итерации цикла за один раз:

idx <- 2:3

dat[, paste0('followup', idx)] <- lapply(idx, function(x)
  f(dat$subject_id, dat$visit_number, x))

#   visit_id subject_id visit_number followup2 followup3
# 1        1   Subject1            1       yes       yes
# 2        3   Subject1            2       yes       yes
# 3        5   Subject1            3       yes       yes
# 4        2   Subject2            1       yes        no
# 5        6   Subject2            2       yes        no
# 6        4   Subject3            1        no        no
1 голос
/ 29 октября 2019

Вместо того, чтобы пытаться сделать все это за один раз, я бы отделил его от первого определения, был ли у субъекта второй (или третий) визит или нет, а затем добавления столбца с использованием этих данных.

Для первого:

subj_2_vist <- dat$subject_id[dat$visit_number==2]

Теперь subj_2_visit будет вектором всех посетителей, у которых было второе посещение. Затем вы можете использовать ifelse() для создания нового столбца:

dat$followup2 <- ifelse(dat$subject_id %in% subj_2_visit, "Yes", "No")

То же самое можно использовать для трех посещений, изменив чек в первой части.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...