如何高效生成N(%)格式的分类变量汇总表?
如何高效生成N(%)格式的分类变量汇总表?
嘿,我来给你几个实用又高效的解决方案,帮你快速生成想要的N(%)格式分类变量汇总表~
方法一:基础R自定义函数(适合习惯原生R的场景)
既然你已经想到了table()和prop.table(),那我们可以把这两个工具封装成一个自定义函数,不用重复写代码就能快速处理每个分类变量:
# 定义生成N(%)汇总的函数 tab_summary <- function(var) { # 计算频数 freq_table <- table(var) # 计算百分比并转成百分比数值 pct_values <- prop.table(freq_table) * 100 # 按照需求拼接格式,sprintf控制小数位数和补零(实现09.3%这类格式) formatted_result <- paste0(freq_table, " [", sprintf("%04.1f", pct_values), "%]") # 转成易读的数据框格式 data.frame(类别 = names(freq_table), `N [%]` = formatted_result, row.names = NULL) } # 加载数据并应用函数 data("mtcars") # 处理am变量 tab_summary(mtcars$am) # 处理gear变量 tab_summary(mtcars$gear) # 处理carb变量 tab_summary(mtcars$carb)
如果不需要补零效果,把sprintf("%04.1f", pct_values)改成sprintf("%.1f", pct_values)就可以啦。
方法二:tidyverse管道风格(适合数据流程化处理)
如果你平时习惯用tidyverse系列包,用dplyr+tidyr的管道操作会更流畅,代码可读性也更高:
library(tidyverse) # 定义通用的分类变量汇总函数 summarize_cat <- function(df, var) { df %>% # 计算每个类别的频数 count({{var}}) %>% # 计算百分比 mutate(pct = n / sum(n) * 100, # 拼接成N(%)格式 `N [%]` = paste0(n, " [", sprintf("%04.1f", pct), "%]")) %>% # 只保留需要的列 select({{var}}, `N [%]`) } # 应用到各个变量 summarize_cat(mtcars, am) summarize_cat(mtcars, gear) summarize_cat(mtcars, carb)
这里的{{var}}是tidy eval语法,用来灵活传递变量名,让函数适配不同的分类变量。
方法三:janitor包快捷生成(最省心的方案)
janitor包专门为数据清洗和汇总设计,其中的tabyl()函数可以一键生成频数百分比表,配合辅助函数就能快速得到你想要的格式:
library(janitor) # 处理am变量的示例 mtcars %>% # 生成基础的频数百分比表 tabyl(am) %>% # 格式化百分比,保留1位小数 adorn_pct_formatting(digits = 1, rounding = "half up") %>% # 把频数加到百分比前面 adorn_ns(position = "front") %>% # 拼接成你需要的N(%)格式 mutate(`N [%]` = paste0(n, " [", percent, "]")) %>% # 调整列顺序 select(am, `N [%]`) # 同理处理gear和carb变量 mtcars %>% tabyl(gear) %>% adorn_pct_formatting(digits = 1) %>% adorn_ns(position = "front") %>% mutate(`N [%]` = paste0(n, " [", percent, "]")) %>% select(gear, `N [%]`)
这个方法几乎不用手动计算,几行代码就能搞定,非常高效省心。
这些方法都能帮你快速生成符合要求的汇总表,你可以根据自己的代码习惯选择合适的方案~
备注:内容来源于stack exchange,提问作者King Frazier
相关产品推荐
相关产品推荐

