使用R的kable生成多变量频数百分比表格并导出至Word
多变量回答分布表格解决方案
要实现将多个rating变量整合到同一表格,左侧显示变量名、右侧对应5种回答的频数(n)和百分比(%)的布局,可以按以下步骤操作:
步骤1:数据预处理
首先清理回答文本中的多余空格(避免因空格导致的类别不一致),并定义所有可能的回答选项(确保统计时覆盖所有类别):
library(tidyr) library(knitr) library(tidyverse) # 清理回答字段的首尾空格 df_clean <- df %>% mutate(across(everything(), str_trim)) # 定义所有回答选项的固定顺序 response_levels <- c("Very important", "Important", "Neutral", "Unimportant", "Very unimportant")
步骤2:批量统计频数与百分比
将宽格式数据转为长格式,批量计算每个变量下各回答的频数和百分比:
long_df <- df_clean %>% # 转长格式:变量名一列,回答内容一列 pivot_longer(cols = everything(), names_to = "variable", values_to = "response") %>% # 把回答转为因子,确保按预设顺序排列 mutate(response = factor(response, levels = response_levels)) %>% # 按变量+回答分组统计频数 group_by(variable, response) %>% summarise(n = n(), .groups = "drop") %>% # 按变量分组计算百分比 group_by(variable) %>% mutate(percent = round(100 * n / sum(n), 1)) %>% ungroup()
步骤3:转换为目标宽格式布局
将长格式数据转回宽格式,让每个回答的n和%作为独立列:
wide_df <- long_df %>% pivot_wider( id_cols = variable, names_from = response, values_from = c(n, percent), # 列名格式:回答内容_统计类型(n/percent) names_glue = "{response}_{.value}" ) %>% # 补充缺失回答的0值(比如某变量没有"Very important"回答时填0) mutate(across(contains(response_levels), ~replace_na(., 0))) %>% # 按预设的回答顺序排列列,匹配目标布局 select( variable, paste0(response_levels, "_n"), paste0(response_levels, "_percent") )
步骤4:添加总计行并生成表格
添加Total行汇总所有变量的频数,最后用kable生成可导出Word的表格:
final_df <- wide_df %>% add_row( variable = "**Total**", # 汇总所有n列的数值,百分比列统一设为100% !!!map_dfc(select(wide_df, -variable), ~ifelse(str_detect(colnames(.), "_n"), sum(.), 100)) ) # 生成表格,设置对齐方式和列名 final_df %>% kable( align = "lcccccccccc", # 11列:1个变量列 + 5组n/%列 col.names = c( "**变量**", "非常重要(n)", "重要(n)", "中立(n)", "不重要(n)", "非常不重要(n)", "非常重要(%)", "重要(%)", "中立(%)", "不重要(%)", "非常不重要(%)" ), caption = "各变量回答分布统计" )
说明
- 处理后的表格可直接通过RStudio的"导出"功能或
knitr::pandoc_convert转为Word文档。 - 所有预设的回答选项都会被包含,即使某变量没有对应回答,频数会显示为0,百分比显示为0.0。
内容的提问来源于stack exchange,提问作者Emma
相关产品推荐
相关产品推荐

