使用dplyr与flextable实现按Niveau分组的行求和
为flextable添加Niveau分组求和行的解决方案
核心思路
先在数据处理阶段构造包含分组汇总行的数据集,再传入flextable进行格式化,这种方式比直接在表格对象中操作更直观易维护。
步骤1:构造带汇总行的数据集
使用dplyr的分组功能生成每个Niveau的求和行,再与原数据合并:
library(dplyr) library(flextable) data_with_totals <- data %>% pivot_wider(names_from = Annee, values_from = `Nombre`) %>% replace(is.na(.), 0) %>% arrange(match(Sexe, c("Filles", "Garçons")), match(Niveau, c("Groupe 1", "Groupe 2"))) %>% # 按Niveau分组生成汇总行 group_by(Niveau) %>% group_modify(~ { # 对所有年份列求和,Sexe列标记为"总计" total_row <- .x %>% summarise(across(starts_with("20"), sum), Sexe = "总计") bind_rows(.x, total_row) }) %>% ungroup() %>% # 确保每个分组的"总计"行排在最后 arrange(match(Niveau, c("Groupe 1", "Groupe 2")), match(Sexe, c("Filles", "Garçons", "总计")))
步骤2:格式化flextable并优化汇总行样式
基于新数据集生成表格,同时给汇总行设置区分样式:
data_with_totals %>% flextable() %>% align(align = "center", part = "all") %>% theme_zebra() %>% merge_v(j = "Niveau") %>% border_outer(part = "all") %>% hline_top(part = "header") %>% # 给汇总行添加粗底边框,分隔不同分组 hline(i = ~ Sexe == "总计", border = fp_border(style = "solid", width = 2), part = "body") %>% align(align = "center", part = "header") %>% border_inner_v(part = "all") %>% valign(valign = "center", part = "header") %>% fix_border_issues(part = "all") %>% # 可选:给汇总行文字加粗 bold(i = ~ Sexe == "总计", part = "body")
注意事项
- 如果年份列不是以"20"开头,需修改
starts_with("20")为实际列名匹配规则,比如contains("Annee")或直接指定列名向量 - 可根据需求调整汇总行的字体颜色、背景色等样式,比如添加
bg(i = ~ Sexe == "总计", bg = "#f0f0f0", part = "body")设置背景色
内容的提问来源于stack exchange,提问作者Chloé
相关产品推荐
相关产品推荐

