如何用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
相关产品推荐
相关产品推荐

