在纵向研究的长表中,如何在大量个体之间高效循环?

问题描述 投票:0回答:1

我致力于研究性传播疾病,例如淋病及其可能的后果,例如女性宫外孕。我有第一个数据集(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
r loops grouping long-integer longitudinal
1个回答
0
投票

无需循环。这应该需要几秒钟的时间来处理您的完整数据。

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
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.