如何使用dplyr生成含女性占比计算的分组汇总表
解决方案
首先,你的示例数据里缺少性别变量(用于计算女性占比),我先补充一个gender变量到数据集里,后续代码基于此展开。以下是完整的实现步骤和代码:
步骤说明
- 将字符串分组变量
x1、x2转为因子类型; - 按
x1、x2分组; - 对每个入学年份变量(
x3、x4、x5),分别计算:- 入学总人数:统计该变量取值为
1的有效样本数(排除NA); - 女性占比:在该年份入学的样本中,女性人数占总入学人数的百分比(保留1位小数)。
- 入学总人数:统计该变量取值为
完整代码
library(dplyr) # 补充性别变量后的示例数据集 df <- data.frame( x1 = c("chr", "chr", "chr", "chr", "chr", "chr", "chr", "chr", "chr", "chr"), x2 = c("chr", "chr", "chr", "chr", "chr", "chr", "chr", "chr", "chr", "chr"), x3 = c(1, 0, 0, NA, 0, 1, 1, NA, 0, 1), # x3=1代表该年份入学 x4 = c(1, 1, NA, 1, 1, 0, NA, NA, 0, 1), # x4=1代表该年份入学 x5 = c(1, 0, NA, 1, 0, 0, NA, 0, 0, 1), # x5=1代表该年份入学 gender = c("女", "男", "女", "女", "男", "女", "男", "女", "男", "女") # 新增性别变量 ) # 转换分组变量为因子类型 df <- df %>% mutate(across(c(x1, x2), as.factor)) # 分组计算汇总表 summary_table <- df %>% group_by(x1, x2) %>% summarise( # x3相关统计 x3a = sum(x3 == 1, na.rm = TRUE), # x3年份入学总人数 x3b = ifelse(x3a > 0, round(mean(gender == "女" & x3 == 1, na.rm = TRUE) * 100, 1), NA), # x3年份女性占比,避免除以0 # x4相关统计 x4a = sum(x4 == 1, na.rm = TRUE), x4b = ifelse(x4a > 0, round(mean(gender == "女" & x4 == 1, na.rm = TRUE) * 100, 1), NA), # x5相关统计 x5a = sum(x5 == 1, na.rm = TRUE), x5b = ifelse(x5a > 0, round(mean(gender == "女" & x5 == 1, na.rm = TRUE) * 100, 1), NA), .groups = "drop" # 取消分组状态 ) # 查看结果 summary_table
代码解释
across(c(x1, x2), as.factor):批量将x1、x2转为因子类型;sum(x3 == 1, na.rm = TRUE):统计分组内x3取值为1的样本数(na.rm=TRUE忽略缺失值);mean(gender == "女" & x3 == 1, na.rm = TRUE)*100:计算x3年份入学样本中女性的占比并转为百分比,round(...,1)保留1位小数;ifelse(x3a>0, ..., NA):如果该年份没有入学人数,女性占比设为NA,避免出现无效的0/0计算;.groups="drop":完成统计后取消分组,返回普通数据框。
内容的提问来源于stack exchange,提问作者asz
相关产品推荐
相关产品推荐

