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

使用gtsummary生成Likert数据汇总统计表的技术求助

5点Likert量表数据汇总统计表解决方案

需求与问题

需要基于5点Likert量表的受访者数据生成汇总表,要求:

  • 每行对应一个调查项目
  • 每列对应一个Likert选项,展示响应频率(n)和百分比(%)
  • 额外包含平均值列
    当前使用tbl_summary()生成的是每个项目独立的表格,不符合单表汇总的需求。

解决方案

通过数据格式转换+分组统计+表格美化的步骤实现,以下是完整代码(基于你提供的示例数据):

library(tidyverse)
library(gt)
library(glue)

# 加载示例数据
df1 <- data.frame(ID = c(1, 2, 3, 4, 5),
                  item1 = c('strongly support', 'neutral', 'oppose', 'somewhat oppose', 'somewhat support'),
                  item2 = c('oppose', 'strongly support','somewhat support', 'strongly oppose', 'neutral'),
                  item3 = c('oppose','oppose','oppose','strongly support','somewhat support'),
                  item4 = c('oppose','strongly support','oppose','strongly support','somewhat support'),
                  item5 = c('oppose','strongly oppose','oppose','strongly support','somewhat support'))

# 1. 转换为长格式并为Likert选项赋值(用于计算平均值)
df_long <- df1 %>%
  select(-ID) %>%
  pivot_longer(cols = everything(), names_to = "项目", values_to = "响应") %>%
  mutate(
    响应数值 = case_when(
      响应 == "strongly oppose" ~ 1,
      响应 == "oppose" ~ 2,
      响应 == "neutral" ~ 3,
      响应 == "somewhat support" ~ 4,
      响应 == "strongly support" ~ 5
    )
  )

# 2. 分组计算每个项目的统计量
summary_stats <- df_long %>%
  group_by(项目) %>%
  summarise(
    `强烈反对(n,%)` = glue("{sum(响应 == 'strongly oppose')}, {round(mean(响应 == 'strongly oppose')*100,1)}%"),
    `反对(n,%)` = glue("{sum(响应 == 'oppose')}, {round(mean(响应 == 'oppose')*100,1)}%"),
    `中立(n,%)` = glue("{sum(响应 == 'neutral')}, {round(mean(响应 == 'neutral')*100,1)}%"),
    `有点支持(n,%)` = glue("{sum(响应 == 'somewhat support')}, {round(mean(响应 == 'somewhat support')*100,1)}%"),
    `强烈支持(n,%)` = glue("{sum(响应 == 'strongly support')}, {round(mean(响应 == 'strongly support')*100,1)}%"),
    `平均值` = round(mean(响应数值, na.rm = TRUE), 2)
  )

# 3. 生成并美化汇总表格
summary_stats %>%
  gt() %>%
  tab_header(title = "**5点Likert量表响应汇总**") %>%
  fmt_markdown(columns = everything()) %>%
  cols_align(align = "center", columns = -`项目`) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_column_labels()
  )

代码说明

  1. 格式转换:将宽格式数据转为长格式,便于按项目分组统计所有选项的响应情况。
  2. 数值赋值:给每个Likert文字选项分配对应数值,用于计算项目的平均响应值。
  3. 统计计算:通过dplyr分组计算每个选项的响应次数和占比,同时算出平均值。
  4. 表格美化:用gt包设置表头对齐、加粗列名等样式,生成符合需求的单表。

内容的提问来源于stack exchange,提问作者C_bath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:21:06