У меня есть некоторый код, который включает цикл for и вложенные операторы if. Проблема в том, что это занимает слишком много времени, и я хочу сделать это намного быстрее.
У меня есть данные о когортах во фрейме данных с именем f2_cebu_davao. В этом фрейме данных также есть столбец с именем person_id. Существует три категории когорт: «Базовая линия», «Другие эффекты», «Кампания».
Я хочу пройтись по каждому person_id в фрейме данных f2_cebu_davao и проверить, в какой он когорте. Если она входит в когорту «Базовая линия» или «Другие эффекты», то я проверю таблицу before_baseline_othereffects, чтобы увидеть если идентификатор можно найти в этой таблице. Если это возможно, я создаю новый столбец в таблице f2_cebu_davao, и значение будет «возвращаться». В противном случае, «новый».
Если имя когорты «кампания», я проверю таблицу before_campaign и выполним ту же процедуру, что и выше.
Мои данные довольно большие (все мои объекты большие), поэтому на их запуск уходит очень много времени (он работает более 30 минут и все еще не завершен!).
Как я могу ускорить это (возможно, используя векторизацию или просто немного изменив код)?
Я пытался сделать цикл, но это занимает слишком много времени.
before_baseline_othereffects <- subset(loans_final_full, submitted_at_date < '2018-05-21')
before_campaign <- subset(loans_final_full, submitted_at_date < '2019-01-21')
for(i in 1:nrow(f2_cebu_davao)){
if(as.vector(f2_cebu_davao[, 'cohort'][i]) == 'Baseline') {
if(as.vector(f2_cebu_davao[,'person_id'][i]) %in% as.vector(unique(before_baseline_othereffects$person_id)) == TRUE) {
f2_cebu_davao$new_or_returning[i] <- 'Returning'
} else {
f2_cebu_davao$new_or_returning[i] <- 'New'
}
} else if (as.vector(f2_cebu_davao[, 'cohort'][i]) == 'Other Effects'){
if(as.vector(f2_cebu_davao[,'person_id'][i]) %in% as.vector(unique(before_baseline_othereffects$person_id)) == TRUE) {
f2_cebu_davao$new_or_returning[i] <- 'Returning'
} else {
f2_cebu_davao$new_or_returning[i] <- 'New'
}
} else {
if(as.vector(f2_cebu_davao[,'person_id'][i]) %in% as.vector(unique(before_campaign$person_id)) == TRUE) {
f2_cebu_davao$new_or_returning[i] <- 'Returning'
} else {
f2_cebu_davao$new_or_returning[i] <- 'New'
}
}
}