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

使用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é

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:14:57