如何在R中按分组统计列值的出现次数及占比
当然有啦!这里有几种超简便的R代码实现方式,不管你是偏好base R原生语法,还是习惯用tidyverse这类工具包,都能轻松搞定你的统计需求~
方法1:Base R 原生实现
先构造你的示例数据集,然后用内置函数就能快速统计数量和占比:
# 构造示例数据 df <- data.frame( Group = c(1,1,1,2,1,2,2), Smoker = c("Ex", "None", "None", "Current", "Current", "Ex", "None") ) # 统计各分组下不同吸烟者类型的数量 count_table <- table(df$Group, df$Smoker) cat("各分组吸烟者类型数量:\n") print(count_table) # 计算各分组内的占比(按行计算,即每个Group内部的百分比) prop_table <- prop.table(count_table, margin = 1) * 100 cat("\n各分组吸烟者类型占比(%):\n") print(prop_table)
这里的prop.table()函数通过margin = 1指定按行(也就是每个Group)计算占比,直接得到每个分组内不同吸烟类型的占比情况。
方法2:用dplyr(tidyverse)实现更直观的统计
如果你习惯用tidyverse的链式语法,代码会更易读,且扩展性更强:
library(dplyr) # 统计数量+计算占比 result <- df %>% group_by(Group, Smoker) %>% summarise(Count = n(), .groups = "drop") %>% # 先统计各组合的数量 group_by(Group) %>% mutate(Proportion = paste0(round(Count / sum(Count) * 100, 1), "%")) # 计算分组内占比并格式化 print(result)
这段代码先按Group和Smoker分组统计数量,再回到Group层级计算每个吸烟类型的占比,最后把占比格式成带百分号的字符串,结果一目了然。
方法3:用janitor包一键生成美观的统计表格
如果想要直接得到同时包含数量和百分比的漂亮表格,可以用janitor包的tabyl()函数,一步到位:
library(janitor) # 生成带数量和占比的统计表格 df %>% tabyl(Group, Smoker) %>% adorn_percentages("row") %>% # 按行计算占比 adorn_pct_formatting(digits = 1) %>% # 格式化百分比 adorn_ns() # 同时显示数量
这个输出的表格会把数量和百分比放在同一单元格里,非常适合快速查看和分享结果。
内容的提问来源于stack exchange,提问作者A.A
相关产品推荐
相关产品推荐

