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

如何用R语言for循环生成含org与abx.class的耐药敏感统计表格

用For循环实现病原菌-抗生素耐药/敏感统计表格

需求说明

现有数据集包含12种病原菌(org列)、23种抗生素类别列(如青霉素、氨基糖苷类等),需生成包含以下4列的统计表格:

  • org:病原菌名称
  • abx.class:抗生素类别
  • 耐药总数:对应病原菌对该抗生素耐药(值为0)的样本数
  • 敏感总数:对应病原菌对该抗生素敏感(值为1)的样本数

要求通过for循环自动化提取统计,而非依赖数据格式转换(如原代码的pivot_longer/pivot_wider方式)。

原实现方法(不符合循环要求)

原代码通过宽表转长表、分组统计、再转宽表的方式实现,但未使用循环逻辑:

df_long <- pivot_longer(filtered_mergedfinal, cols = c(Penicillins, Aminoglycosides, Trimethoprim, Macrolides, Lincosamides, Second_gen_cephalosporins,  
                                      Third_gen_cephalosporins, Fluoroquinolones, Carbapenems, Glycylcyclines, Fourth_gen_cephalosporins,  
                                      Polymyxins, Beta_lactam_beta_lactamase_inhibitor, Monobactams, Amphenicols, Trimethoprim_sulfonamide,
                                      Tetracyclines, Beta_lactam,
                                      Glycopeptides, Oxazolidinones, First_gen_cephalosporins, Sulfonaminde, Steroid),
                        names_to = "abx.class", values_to = "suscept")
result2 <- df_long %>% group_by (org, abx.class, suscept) %>% summarise(frequency=n())

lancet <- na.omit(result2)

filtered_lancet <- lancet %>% filter(!grepl("other|contaminant", org))

library(tidyr)

# Pivot the data wider
transformed_lancet <- lancet %>% pivot_wider(names_from = "suscept", values_from = "frequency", names_prefix = "suscept_")

susceptdata <- na.omit(transformed_lancet) 

For循环实现方案

以下代码通过嵌套for循环,逐一遍历抗生素类别和病原菌,统计对应耐药/敏感数量,最终生成目标表格:

# 1. 定义所有抗生素类别列名(和原代码cols参数一致)
abx_classes <- c("Penicillins", "Aminoglycosides", "Trimethoprim", "Macrolides", 
                 "Lincosamides", "Second_gen_cephalosporins", "Third_gen_cephalosporins", 
                 "Fluoroquinolones", "Carbapenems", "Glycylcyclines", "Fourth_gen_cephalosporins", 
                 "Polymyxins", "Beta_lactam_beta_lactamase_inhibitor", "Monobactams", 
                 "Amphenicols", "Trimethoprim_sulfonamide", "Tetracyclines", "Beta_lactam", 
                 "Glycopeptides", "Oxazolidinones", "First_gen_cephalosporins", "Sulfonaminde", "Steroid")

# 2. 获取去重后的病原菌列表(过滤掉other和contaminant)
valid_orgs <- unique(filtered_mergedfinal$org)[!grepl("other|contaminant", unique(filtered_mergedfinal$org))]

# 3. 初始化空结果数据框
result_df <- data.frame(
  org = character(),
  abx.class = character(),
  耐药总数 = integer(),
  敏感总数 = integer(),
  stringsAsFactors = FALSE
)

# 4. 嵌套循环:遍历每个抗生素类别,再遍历每个病原菌
for (abx in abx_classes) {
  for (org in valid_orgs) {
    # 筛选当前病原菌的行
    org_data <- filtered_mergedfinal[filtered_mergedfinal$org == org, ]
    
    # 统计耐药(0)和敏感(1)的数量,NA值自动排除
    resistant_count <- sum(org_data[[abx]] == 0, na.rm = TRUE)
    susceptible_count <- sum(org_data[[abx]] == 1, na.rm = TRUE)
    
    # 将当前统计结果添加到结果数据框
    result_df <- rbind(result_df, data.frame(
      org = org,
      abx.class = abx,
      耐药总数 = resistant_count,
      敏感总数 = susceptible_count,
      stringsAsFactors = FALSE
    ))
  }
}

# 可选:移除所有耐药和敏感数都为0的行(如果存在)
result_df <- result_df[!(result_df$耐药总数 == 0 & result_df$敏感总数 == 0), ]

代码说明

  • 先定义所有抗生素类别列表,避免手动重复录入;
  • 提前筛选有效的病原菌,减少循环次数;
  • 嵌套循环分别遍历抗生素和病原菌,逐一对每个组合统计数量;
  • 每次循环将统计结果追加到结果数据框,最终得到目标结构。

内容的提问来源于stack exchange,提问作者atharvi gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 05:04:50