You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:40:06