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

如何使用dplyr生成含女性占比计算的分组汇总表

解决方案

首先,你的示例数据里缺少性别变量(用于计算女性占比),我先补充一个gender变量到数据集里,后续代码基于此展开。以下是完整的实现步骤和代码:

步骤说明

  1. 将字符串分组变量x1、x2转为因子类型;
  2. 按x1、x2分组;
  3. 对每个入学年份变量(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 20:05:09