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

如何用R语言计算数据框中多个变量的占总数百分比

批量计算数据框多变量的占总数百分比

原始数据框

students <- data.frame(
  names = c("Bill", "Stacey", "Fred", "Jane", "Sarah"), 
  gender = c("M", "F", "M", "F", "F"),
  age = c("10-12", "10-12", "13-15", "7-9", "16-18"),
  stringsAsFactors = FALSE
)

现有问题

现有代码仅能计算单个变量的占比(注:原代码存在拼写错误,nrow(student)需改为nrow(students)),无法同时处理多个变量:

library(dplyr)
result_dplyr <- students %>%
  group_by(gender) %>%
  summarise(per_to_tot = n() / nrow(students) * 100)
print(result_dplyr)

期望输出

需要同时得到多个变量各分类占总样本数的百分比,形式如下:

#    gender per_to_tot
# 1:      M         40
# 2:      F         60
#    age    per_to_tot
# 1:  7-9          20
# 2: 10-12         40
# 3: 13-15         20
# 4: 16-18         20

解决方案

方法1:dplyr + purrr 批量生成独立结果

通过循环批量处理指定变量,每个变量的结果单独输出,符合期望的展示形式:

library(dplyr)
library(purrr)

# 指定需要计算占比的变量
target_vars <- c("gender", "age")

# 批量计算每个变量的占比
results <- map(target_vars, function(var) {
  students %>%
    group_by(!!sym(var)) %>%
    summarise(per_to_tot = n() / nrow(students) * 100) %>%
    ungroup()
})

# 给结果列表命名,方便区分
names(results) <- target_vars

# 逐个打印结果
walk(results, print)

方法2:tidyr 重塑数据后统一计算

先将宽格式数据转为长格式,统一计算后合并输出,适合后续统一处理:

library(dplyr)
library(tidyr)

students %>%
  select(gender, age) %>%  # 筛选需要计算的变量
  pivot_longer(cols = everything(), names_to = "变量名", values_to = "分类") %>%
  group_by(变量名, 分类) %>%
  summarise(计数 = n(), .groups = "drop") %>%
  mutate(占比百分比 = 计数 / nrow(students) * 100) %>%
  select(-计数) %>%
  arrange(变量名, 分类)

内容的提问来源于stack exchange,提问作者bbear

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:05:02