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
| count | per | |
|---|---|---|
| cat | 3 | 3/4 |
| dog | 1 | 1/4 |
table_B
| count | per | |
|---|---|---|
| cat | 2 | 2/6 |
| dog | 4 | 4/6 |
table_C
| count | per | |
|---|---|---|
| cat | 2 | 2/4 |
| dog | 2 | 2/4 |
说明
该实现没有硬编码cat/dog等具体分类值,只要是A/B/C列中出现的非缺失分类值都会被自动统计,后续新增分类值不需要修改代码逻辑。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

