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

R语言dplyr实现数据框各列分类值计数与占比统计

R dplyr实现多列分类值自动统计方案

注意事项

示例构造代码里的"NA"是字符串类型,不是R语言原生的缺失值NA,统计前需要先做转换,否则会把字符串"NA"识别为有效分类值,导致统计结果错误。

实现代码

# 加载依赖包
library(dplyr)
library(tidyr)
library(tibble)

# 构造示例数据,同时修正字符串"NA"为真实缺失值
id = seq(1:10)
A = c("NA","NA","cat","NA","cat","NA","NA","NA","cat","dog")
B = c("dog","NA","dog","NA","cat","dog","dog","dog","cat","cat")
C = c("NA","NA","cat","NA","NA","dog","NA","NA","cat","dog")
frame = tibble(id,A,B,C) %>%
  mutate(across(everything(), ~na_if(., "NA")))

# 核心统计逻辑
stat_result <- frame %>%
  # 将A/B/C三列从宽格式转为长格式,方便统一分组统计
  pivot_longer(cols = c(A, B, C), names_to = "col_name", values_to = "category") %>%
  # 剔除所有缺失值记录
  filter(!is.na(category)) %>%
  # 按列名、分类值分组,统计每个分类的出现次数
  count(col_name, category, name = "count") %>%
  # 按列分组,计算单列非缺失值总个数,拼接成要求的占比格式
  group_by(col_name) %>%
  mutate(
    total = sum(count),
    per = paste(count, total, sep = "/")
  ) %>%
  ungroup() %>%
  # 按列名拆分为独立的统计表
  group_split(col_name) %>%
  setNames(c("A", "B", "C"))

# 提取各列独立统计表,将分类值设为行名
table_A <- stat_result$A %>% select(-col_name, -total) %>% column_to_rownames("category")
table_B <- stat_result$B %>% select(-col_name, -total) %>% column_to_rownames("category")
table_C <- stat_result$C %>% select(-col_name, -total) %>% column_to_rownames("category")

输出结果

运行后三个统计表完全符合预期:

  • table_A
countper
cat33/4
dog11/4
  • table_B
countper
cat22/6
dog44/6
  • table_C
countper
cat22/4
dog22/4

说明

该实现没有硬编码cat/dog等具体分类值,只要是A/B/C列中出现的非缺失分类值都会被自动统计,后续新增分类值不需要修改代码逻辑。

内容的提问来源于stack exchange,提问作者Homer Jay Simpson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:42:18