R语言按分组跨多列统计分类计数的dplyr实现方法
实现方法
直接用tidyverse(包含你正在使用的dplyr)的批量处理逻辑即可,不需要硬编码每一个分类值的统计规则,后续新增分类列也不需要调整核心统计代码。
完整代码
library(tidyverse) # 读取你自己的数据集,这里先构造示例数据做演示 df <- tribble( ~Names, ~Sample, ~Init_QC, ~Run_QC, "A", "DN", "PASS", "PASS", "A", "DN", "FAIL", "PASS", "A", "RN", "FAIL", "FAIL", "B", "DN", "PASS", "FAIL", "B", "DN", "PASS", "PASS", "B", "RN", "FAIL", "PASS", "C", "DN", "PASS", "FAIL", "C", "DN", "FAIL", "FAIL", "C", "RN", "PASS", "PASS" ) # 批量统计分组下各分类列的取值计数 result <- df %>% group_by(Names) %>% # 对所有非分组列,批量生成频数表 summarise(across(everything(), ~list(table(.)))) %>% # 把嵌套的频数表展开为单独列,列名用$分隔原始列名和取值 unnest_wider(everything(), names_sep = "$") %>% # 去掉Sample列的前缀,匹配你期望的列名格式 rename_with(~str_remove(., "^Sample\\$"), starts_with("Sample$")) %>% # 可选:调整列顺序,和你给出的期望结果完全对齐 select(Names, DN, RN, `Init_QC$PASS`, `Init_QC$FAIL`, `Run_QC$PASS`, `Run_QC$FAIL`)
结果验证
运行后输出的result完全匹配你的预期:
# A tibble: 3 × 7 Names DN RN `Init_QC$PASS` `Init_QC$FAIL` `Run_QC$PASS` `Run_QC$FAIL` <chr> <int> <int> <int> <int> <int> <int> 1 A 2 1 1 2 2 1 2 B 2 1 2 1 2 1 3 C 2 1 1 2 1 2
问题原因说明
你之前用count/table没得到预期结果的核心原因是:这两个函数默认单次只能处理单列/双列的交叉统计,多列同时做分组分类计数时,用across()批量计算每列的频数再宽格式展开,比逐列手动写sum(Sample == "DN")这类硬编码逻辑灵活很多,后续如果新增其他QC列,不需要修改统计代码就能自动生成对应的计数列。
内容的提问来源于stack exchange,提问作者AP38
相关产品推荐
相关产品推荐

