【发布时间】:2019-11-09 19:13:12
【问题描述】:
我有一些包含 for 循环和嵌套 if 语句的代码。问题是运行时间太长,我想让它更快。
我有一个名为 f2_cebu_davao 的数据框中的群组数据。此数据框中还有一个名为 person_id 的列。同类群组分为 3 类:“基线”、“其他效果”、“广告系列”。
我想遍历 f2_cebu_davao 数据框中的每个 person_id,并检查它在哪个队列中。如果它在队列“基线”或“其他效果”中,那么我将检查 before_baseline_othereffects 表以查看如果可以在该表中找到 ID。如果可以,我在 f2_cebu_davao 表中创建一个新列,该值将“返回”。否则,“新”。
如果群组名称为“campaign”,我将检查 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'
}
}
}
【问题讨论】:
-
您能提供一些数据和预期的输出吗?
标签: r loops vectorization