如何用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
相关产品推荐
相关产品推荐

