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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:24:29