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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 15:05:24