基于R语言为重复ID的STI感染数据生成同月共感染标记
解决STI患者共感染标记问题
你需要标记同一患者(ID)下同一月内存在多种不同STI感染的记录,这类记录标记为TRUE,否则为FALSE。以下是两种实用实现方法:
方法1:使用dplyr(tidyverse工具包,适合新手)
如果还没安装dplyr,先执行安装命令:
install.packages("dplyr")
再运行以下代码:
library(dplyr) # 加载模拟数据 df <- data.frame( ID = c(1, 1, 1, 2, 3, 3), Disease = c("Chlamydia", "Syphilis", "Chlamydia", "Chlamydia", "Gonorrhea", "Chlamydia"), Date = as.Date(c("2023-01-25", "2023-01-25", "2023-07-13", "2023-03-16", "2023-04-02", "2023-08-29")) ) # 生成Flag变量 df_with_flag <- df %>% # 按患者ID分组,仅在组内计算 group_by(ID) %>% # 生成年月标识,用于判断是否同一月感染 mutate(YearMonth = format(Date, "%Y-%m")) %>% # 按ID+年月再次分组,统计组内不同疾病数量 group_by(ID, YearMonth) %>% # 若组内疾病数>1,标记为共感染(TRUE) mutate(Flag = n_distinct(Disease) > 1) %>% # 移除临时生成的年月列 select(-YearMonth) %>% # 取消分组 ungroup() # 查看结果 df_with_flag
代码说明
group_by(ID):将数据按患者ID拆分,确保仅在同一患者的记录内计算format(Date, "%Y-%m"):把日期转为年-月格式(如2023-01),统一判断“同一月”的标准n_distinct(Disease):统计当前组内的不同疾病种类数,数量大于1即判定为共感染
运行后输出结果与你期望的一致:
# A tibble: 6 × 4 ID Disease Date Flag <dbl> <chr> <date> <lgl> 1 1 Chlamydia 2023-01-25 TRUE 2 1 Syphilis 2023-01-25 TRUE 3 1 Chlamydia 2023-07-13 FALSE 4 2 Chlamydia 2023-03-16 FALSE 5 3 Gonorrhea 2023-04-02 FALSE 6 3 Chlamydia 2023-08-29 FALSE
方法2:使用Base R(无需额外安装包)
如果你不想安装新包,可使用原生R代码实现:
# 加载模拟数据 df <- data.frame( ID = c(1, 1, 1, 2, 3, 3), Disease = c("Chlamydia", "Syphilis", "Chlamydia", "Chlamydia", "Gonorrhea", "Chlamydia"), Date = as.Date(c("2023-01-25", "2023-01-25", "2023-07-13", "2023-03-16", "2023-04-02", "2023-08-29")) ) # 生成年月标识列 df$YearMonth <- format(df$Date, "%Y-%m") # 统计每个ID+年月组合的不同疾病数量 counts <- aggregate(Disease ~ ID + YearMonth, data = df, FUN = function(x) length(unique(x))) names(counts)[3] <- "DistinctDiseases" # 合并统计结果到原数据,生成Flag df_with_flag <- merge(df, counts, by = c("ID", "YearMonth")) df_with_flag$Flag <- df_with_flag$DistinctDiseases > 1 # 整理列顺序并移除临时列 df_with_flag <- df_with_flag[, c("ID", "Disease", "Date", "Flag")] # 查看结果 df_with_flag
代码说明
aggregate(...):按ID和年月分组,统计每组内的不同疾病数量merge(...):把统计结果合并回原数据,让每条记录都能匹配到对应的疾病数量df_with_flag$Flag <- ...:通过疾病数量判断是否为共感染,生成标记列
内容的提问来源于stack exchange,提问作者shollaback
相关产品推荐
相关产品推荐

