R语言新手求助:生成多0/1变量频率占比饼图并按性别对比
解决R语言0/1分类变量饼图及性别对比问题
你当前的代码仅统计了每个变量的总案例数,未按0/1水平分组统计,且示例数据缺少性别变量,导致无法实现性别对比。以下是修正后的完整解决方案:
1. 重构带性别变量的示例数据
set.seed(99) # 生成0/1分类变量 A = sample(c(0,1), 100, replace = T) B = sample(c(0,1), 100, replace = T) C = sample(c(0,1), 100, replace = T) D = sample(c(0,1), 100, replace = T) E = sample(c(0,1), 100, replace = T) # 添加性别变量(男/女) gender = sample(c("男", "女"), 100, replace = T) # 构建数据框并转换为因子类型 df = data.frame(A, B, C, D, E, gender) df[, c("A","B","C","D","E")] = lapply(df[, c("A","B","C","D","E")], factor) df$gender = factor(df$gender)
2. 绘制整体各变量0/1水平分布饼图
每个变量单独展示0(否)、1(是)的占比:
library(tidyverse) # 数据整理:转长格式+按变量+水平分组统计数量 df_long = df %>% pivot_longer(cols = c(A,B,C,D,E), names_to = "变量名", values_to = "水平") %>% group_by(变量名, 水平) %>% summarize(数量 = n(), .groups = "drop") # 绘制分面饼图 ggplot(df_long, aes(x = "", y = 数量, fill = 水平)) + geom_bar(stat = "identity", width = 1) + coord_polar("y") + facet_wrap(~变量名) + theme_minimal() + theme(axis.text.x = element_blank(), axis.title = element_blank(), legend.title = element_text(text = "水平(0=否/1=是)")) + labs(title = "各变量0/1水平分布饼图")
3. 绘制按性别对比的各变量0/1水平饼图
通过分面实现男/女组的横向对比:
# 数据整理:按性别+变量+水平分组统计 df_gender = df %>% pivot_longer(cols = c(A,B,C,D,E), names_to = "变量名", values_to = "水平") %>% group_by(gender, 变量名, 水平) %>% summarize(数量 = n(), .groups = "drop") # 绘制分面对比饼图 ggplot(df_gender, aes(x = "", y = 数量, fill = 水平)) + geom_bar(stat = "identity", width = 1) + coord_polar("y") + facet_grid(gender ~ 变量名) + theme_minimal() + theme(axis.text.x = element_blank(), axis.title = element_blank(), legend.title = element_text(text = "水平(0=否/1=是)")) + labs(title = "按性别对比各变量0/1水平分布")
关键修正说明
- 新增
gender变量补全性别对比所需数据 - 调整分组逻辑:通过
group_by(变量名, 水平)(或叠加gender),用n()统计每个水平的实际数量,替代原代码仅统计总案例数的错误逻辑 - 用
facet_wrap/facet_grid实现多变量、多维度的分面展示,让饼图对比更直观
内容的提问来源于stack exchange,提问作者NeoLight
相关产品推荐
相关产品推荐

