如何在R(Studio)中按分组生成Likert量表频数分布表
按Workshop分组生成Likert题项频数分布表的R实现
核心方案
借助tidyverse工具链(尤其是dplyr的分组嵌套和purrr的批量处理),或者基础R循环,针对每个Workshop分组,批量生成对应Likert题项的频数分布表。下面是两种实用方案:
具体代码实现
假设你的数据集名为survey_data,分组变量为Workshop,Likert题项为Q1、Q2、Q3(按需替换为实际列名)
1. 加载依赖包
library(dplyr) library(janitor) # 快速生成带百分比的美观频数表 library(purrr) library(knitr) # 用于R Markdown中渲染表格
2. 方案一:Tidyverse批量处理(推荐)
这种方式代码简洁,输出结构清晰,适合后续整理或渲染:
# 定义Likert题项列名,也可用starts_with("Q")自动匹配 likert_cols <- c("Q1", "Q2", "Q3") # 按Workshop分组生成所有题项的频数表 grouped_freq_tables <- survey_data %>% group_by(Workshop) %>% nest() %>% mutate( freq_tables = map(data, ~ map(.x[likert_cols], tabyl, show_missing = TRUE)) ) %>% unnest(freq_tables) # 查看结果 grouped_freq_tables
如果要在R Markdown中直接渲染成美观的表格:
survey_data %>% group_by(Workshop) %>% group_walk(function(sub_data, group_info) { # 输出分组标题 cat(paste0("\n### Workshop: ", group_info$Workshop, "\n")) # 遍历每个题项生成表格 map(likert_cols, function(col) { sub_data %>% tabyl(!!sym(col)) %>% adorn_pct_formatting(digits = 1) %>% # 保留1位小数的百分比 kable(caption = paste("题项", col, "频数分布")) }) %>% walk(print) })
3. 方案二:基础R循环(无需额外包)
如果不习惯tidyverse,用基础R也能快速实现:
likert_cols <- c("Q1", "Q2", "Q3") unique_workshops <- unique(survey_data$Workshop) # 循环遍历每个Workshop for (ws in unique_workshops) { cat(sprintf("\n===== Workshop: %s =====\n", ws)) # 遍历每个题项生成频数表 for (item in likert_cols) { cat(sprintf("\n--- 题项: %s ---\n", item)) item_table <- table(survey_data[survey_data$Workshop == ws, item], useNA = "ifany") print(item_table) # 可选:添加百分比 print(prop.table(item_table) * 100) } }
关键提示
- 确保
Workshop是字符或因子类型,避免数值型分组出现异常 - 若Likert题项命名有规律(比如全是Q开头),可用
likert_cols <- names(survey_data)[grepl("^Q", names(survey_data))]自动筛选,不用手动列名 - 要展示缺失值的话,
tabyl加show_missing=TRUE,基础Rtable加useNA="ifany"
内容的提问来源于stack exchange,提问作者Saar
相关产品推荐
相关产品推荐

