我致力于研究性传播疾病,例如淋病及其可能的后果,例如女性宫外孕。我有第一个数据集(df_gono),其中包含患者每年是否被诊断出患有淋病以及有多少次类别。我有第二个数据集(df_ecto),其中包含患者每年是否被诊断为异位妊娠以及有多少次类别。对于后一个数据集,我想添加一个新变量,一旦她在给定年份类别中被诊断出患有淋病,该变量在所有后续年份中都取值为 1。 我写了一个运行良好的循环。然而,当将 ca 应用于真实数据集时,该循环对我来说似乎非常简单。 1Mio 线和约。 600 000 名独特患者,需要 > 3 小时。有什么想法可以提高效率并减少耗时吗?
df_gono <- data.frame(pat_id = c("A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C"), year_cat = c("2000-2005", "2006-2010", "2011-2015", "2016-2020"), n_gono = c(0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0))
df_gono
df_ecto <- data.frame(pat_id = c("A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C"), year_cat = c("2000-2005", "2006-2010", "2011-2015", "2016-2020"), n_ecto = c(1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0))
df_ecto
for (i in c(unique(df_ecto$pat_id))) {
gono <- df_gono[df_gono$pat_id == i, "n_gono"]
if (any(gono$n_gono > 0)) {
status_gono <- c(rep(0, each = 1, len = which(gono$n_gono != 0)[1]-1), rep(1, each = 1, len = dim(gono)[1]-(which(gono$n_gono != 0)[1])+1))
} else {
status_gono <- c(rep(0, each = 1, len = dim(gono)[1]))
}
df_ecto$gono_status[df_ecto$pat_id == i] <- status_gono
}
df_ecto
无需循环。这应该需要几秒钟的时间来处理您的完整数据。
library(dplyr)
df_ecto |>
left_join(df_gono, by = c("pat_id", "year_cat")) |>
mutate(status_gono = cumsum(n_gono), .by = pat_id)
# pat_id year_cat n_ecto n_gono status_gono
# 1 A 2000-2005 1 0 0
# 2 A 2006-2010 0 0 0
# 3 A 2011-2015 0 1 1
# 4 A 2016-2020 0 0 1
# 5 B 2000-2005 0 1 1
# 6 B 2006-2010 1 0 1
# 7 B 2011-2015 0 0 1
# 8 B 2016-2020 1 0 1
# 9 C 2000-2005 0 0 0
# 10 C 2006-2010 0 0 0
# 11 C 2011-2015 0 0 0
# 12 C 2016-2020 0 0 0