如何在R中为单维频数表的频数添加百分比并生成横向表格
解决方案
这里提供两种实现方式,都能生成符合你需求的横向表格,完美兼容knitr::kable:
方法一:Base R实现(无需额外包)
先定义一个处理单个Likert问题的函数,自动计算1-5每个等级的频数和百分比:
calc_likert_stats <- function(x) { # 强制保留1-5所有等级,避免缺失等级不显示 freq <- table(factor(x, levels = 1:5)) # 计算百分比并保留1位小数 pct <- round(prop.table(freq) * 100, 1) # 合并成"频数(百分比%)"格式 paste0(freq, " (", pct, "%)") }
接着对数据集的每一列应用这个函数,整理成表格格式:
# 批量处理所有问题列 result_matrix <- t(sapply(data, calc_likert_stats)) # 转换为数据框并添加问题列 result_df <- as.data.frame(result_matrix, stringsAsFactors = FALSE) result_df$Question <- rownames(result_df) # 调整列顺序,把问题列放在最前面 result_df <- result_df[, c("Question", "1", "2", "3", "4", "5")] # 用knitr::kable渲染表格 knitr::kable(result_df, align = "lccccc", caption = "5级Likert量表响应统计")
方法二:Tidyverse实现(适合熟悉dplyr/tidyr的用户)
如果你习惯使用tidyverse系列包,可以用以下代码:
library(dplyr) library(tidyr) result_df <- data %>% # 宽格式转长格式,方便分组统计 pivot_longer(cols = everything(), names_to = "Question", values_to = "Response") %>% # 按问题和响应等级统计频数 count(Question, Response) %>% # 按问题计算每个等级的百分比 group_by(Question) %>% mutate(pct = round(n / sum(n) * 100, 1), stat = paste0(n, " (", pct, "%)")) %>% ungroup() %>% # 长格式转回宽格式,1-5作为表头 pivot_wider(names_from = Response, values_from = stat, values_fill = "0 (0.0%)") %>% # 确保列顺序为1到5 select(Question, `1`, `2`, `3`, `4`, `5`) # 渲染表格 knitr::kable(result_df, align = "lccccc", caption = "5级Likert量表响应统计")
关键说明
- 两种方法都会自动保留1-5所有等级,哪怕某个问题没有对应响应,也会显示
0 (0.0%),避免表头缺失。 - 百分比保留1位小数,你可以根据需求修改
round()函数的第二位参数调整精度。 align = "lccccc"设置表格对齐方式:问题列左对齐,数值列居中对齐,提升可读性。
内容的提问来源于stack exchange,提问作者DavidQ
相关产品推荐
相关产品推荐

