在R中从多变量列生成含计数与百分比的是/否/未知列并制作flextable
解决flextable双层表头与百分比统计问题
步骤1:数据预处理与统计
先把宽格式数据转成长格式,统一统计每个变量各取值的计数(n)和变量内占比:
library(tidyverse) library(flextable) # 模拟你的数据(替换成实际数据即可) set.seed(123) df <- tibble( var1 = sample(c("Yes", "No", "Unknown"), 100, replace = TRUE), var2 = sample(c("Yes", "No", "Unknown"), 100, replace = TRUE), var3 = sample(c("Yes", "No", "Unknown"), 100, replace = TRUE), var4 = sample(c("Yes", "No", "Unknown"), 100, replace = TRUE), var5 = sample(c("Yes", "No", "Unknown"), 100, replace = TRUE) ) # 统计计数与百分比 summary_df <- df %>% # 宽表转长表:所有变量列转为「变量」和「取值」两列 pivot_longer(cols = everything(), names_to = "变量", values_to = "取值") %>% # 按变量+取值分组,统计计数 group_by(变量, 取值) %>% summarize(n = n(), .groups = "drop") %>% # 按变量分组,计算每个取值的变量内百分比 group_by(变量) %>% mutate(百分比 = paste0(round(n / sum(n) * 100, 1), "%")) %>% ungroup() %>% # 转回宽表,让同一取值的n和%相邻 pivot_wider( id_cols = 变量, names_from = 取值, values_from = c(n, 百分比), names_glue = "{取值}_{.value}" ) %>% # 调整列顺序,确保Yes/No/Unknown的n和%依次排列 select(变量, Yes_n, Yes_百分比, No_n, No_百分比, Unknown_n, Unknown_百分比)
步骤2:制作带双层表头的flextable
通过add_header_row添加上层表头,再用merge_h合并对应单元格,实现双层结构:
ft <- flextable(summary_df) %>% # 设置下层表头为「n」和「%」 set_header_labels( 变量 = "变量", Yes_n = "n", Yes_百分比 = "%", No_n = "n", No_百分比 = "%", Unknown_n = "n", Unknown_百分比 = "%" ) %>% # 添加上层表头:对应Yes/No/Unknown,每个占2列 add_header_row( values = c("变量", "Yes", "Yes", "No", "No", "Unknown", "Unknown"), top = TRUE ) %>% # 合并上层表头的重复单元格 merge_h(part = "header") %>% # 调整样式:居中对齐+booktabs主题 align(align = "center", part = "all") %>% theme_booktabs() %>% # 自定义列宽(可根据需求调整) width(width = c(1, rep(0.8, 6))) # 查看结果 ft
关键细节说明
- 变量映射:用
pivot_longer把多变量列统一转成「变量-取值」的长格式,避免重复写统计逻辑,适配任意数量的变量列。 - 百分比计算:按
变量分组后计算占比,确保百分比是每个变量内部的比例,而非全局比例。 - 双层表头:先设置下层的「n/%」标签,再添加上层的「Yes/No/Unknown」,通过
merge_h合并同一取值对应的两个表头单元格,形成双层嵌套结构。
内容的提问来源于stack exchange,提问作者Jackie
相关产品推荐
相关产品推荐

