Поскольку вы повторяете одно и то же задание снова и снова, вы можете создать функцию для выполнения этой работы, а затем выполнить цикл по движущимся частям.
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