使用 Dplyr 和 Flextable 进行行求和

问题描述 投票:0回答:1

我用弹性表做了一张桌子:

data %>%
  pivot_wider(names_from=Annee, values_from=c(`Nombre`)) %>%
  replace(is.na(.), 0) %>%
  arrange(match(Sexe, c("Filles", "Garçons"))) %>%
  arrange(match(Niveau, c("Groupe 1", "Groupe 2"))) %>%
  flextable::flextable() %>% 
  flextable::align(align = "center", part = "all") %>%
  theme_zebra()%>%
  merge_v(j = c("Niveau"))%>%
  border_outer(part = "all") %>%
  hline_top(part = "header") %>%
  hline(part="body")%>%
  align(align = "center", part = "header") %>% 
  border_inner_v(part = "all")%>% 
  valign(valign = "center", part = "header")%>% 
  fix_border_issues(part = "all")

我需要在弹性表中添加一个新行,这将是每个“Niveau”的“Nombre”之和。 预先感谢您的帮助!

r dplyr flextable
1个回答
2
投票

使用一个小的自定义函数将总计行添加到您可以执行的操作:

library(dplyr)
library(tidyr)
library(ggplot2)
library(flextable)

add_total <- \(x) {
  x %>%
    group_by(Niveau) %>%
    summarise(Sexe = "Total", across(where(is.numeric), sum)) %>%
    bind_rows(x)
}

data %>%
  pivot_wider(names_from = Annee, values_from = c(`Effectifs`)) %>%
  replace(is.na(.), 0) %>%
  add_total() %>%
  arrange(match(Sexe, c("Filles", "Garçons", "Total"))) %>%
  arrange(match(Niveau, c("CP", "CE1"))) %>%
  flextable::flextable() %>%
  flextable::align(align = "center", part = "all") %>%
  theme_zebra() %>%
  merge_v(j = c("Niveau")) %>%
  border_outer(part = "all") %>%
  hline_top(part = "header") %>%
  hline(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 == "Total")

© www.soinside.com 2019 - 2024. All rights reserved.