Le package ‘flextable’ (Gohel and Skintzos 2023) fourni une fonction as_flextable() qui permet de transformer les tableaux créés avec le package ‘tables’ (Murdoch 2023) en flextable.

La fonction tables::tabular() est un outil puissant qui permet aux utilisateurs de créer facilement des tableaux croisés simples et complexes. La fonction as_flextable() est simple à utiliser, elle transforme les objets ‘tables’ en objets ‘flextable’ et vous permet d’enrichir le tableau avec des informations et/ou du formatage.

Le package ‘tables’ est décrit par son auteur comme suivant :

The tables package provides a formula-driven interface for computing the contents of tables and formatting them. It was inspired by SAS PROC TABULATE, but is not compatible with it.

The user computes a table object by specifying a formula, with the left-hand side giving the rows, and the right-hand side giving the columns; the formula describes the summary functions to apply and how to organize them. […]

La combinaison de ces deux packages offre la possibilité de créer très facilement des tableaux croisés, de les empiler ou de les filtrer, puis de les formater avec “flextable” et de bénéficier de toute une série de fonctionnalités de formatage ainsi que de la possibilité de les exporter dans les formats de sortie pris en charge par “flextable”.

Exemple avec tabular

Créons un tableau croisée d’agrégations basée sur le jeu de données penguins fourni par le package ‘palmerpenguins’ (Horst, Hill, and Gorman 2022) :

library(tables)
library(palmerpenguins)

Mean <- function(x) mean(x, na.rm = TRUE)

Sd <- function(x) sd(x, na.rm = TRUE)

tab <- tabular(
  table = (species + 1) * island ~ 
    (n = 1) + Format(digits = 2) * 
      (bill_depth_mm + body_mass_g) * (Mean + Sd), 
  data = penguins)
print(tab)
#>                                                                   
#>                          bill_depth_mm         body_mass_g        
#>  species   island    n   Mean          Sd      Mean        Sd     
#>  Adelie    Biscoe     44   18.37          1.19 3709.66      487.73
#>            Dream      56   18.25          1.13 3688.39      455.15
#>            Torgersen  52   18.43          1.34 3706.37      445.11
#>  Chinstrap Biscoe      0     NaN            NA     NaN          NA
#>            Dream      68   18.42          1.14 3733.09      384.34
#>            Torgersen   0     NaN            NA     NaN          NA
#>  Gentoo    Biscoe    124   14.98          0.98 5076.02      504.12
#>            Dream       0     NaN            NA     NaN          NA
#>            Torgersen   0     NaN            NA     NaN          NA
#>  All       Biscoe    168   15.87          1.82 4716.02      782.86
#>            Dream     124   18.34          1.13 3712.90      416.64
#>            Torgersen  52   18.43          1.34 3706.37      445.11

Transformation en flextable

Un appel simple à as_flextable() produit un flextable assez similaire aux sorties de la fonction tabular() :

as_flextable(tab)

Il utilise les paramètres par défaut de flextable dans la mesure du possible, il est recommandé de les définir une fois par session.

set_flextable_defaults(
    font.family = "Open Sans", 
    font.color = "#333333",
    digits = 2,
    big.mark = "'", 
    na_str = "", nan_str = "",
    theme_fun = theme_booktabs)

‘tables’ propose de nombreuses options permettant de formater les tableaux. La transformation flextable préserve les types de colonnes, il est plus facile de post formater le tableau avec la syntaxe de flextable si c’est nécessaire :

as_flextable(tab) |> 
  colformat_double() |>
  theme_vanilla()

Le séparateur de lignes

Les séparateurs de groupes peuvent être définis comme des lignes au lieu d’une première colonne afin de réduire la largeur du tableau :

as_flextable(tab, spread_first_col = TRUE) |> 
  colformat_double()

Améliorer avec flextable

Ajoutons maintenant d’autres personnalisations pour illustrer quelques fonctionnalités de flextable qui s’utilisent facilement à tabular() :

  • formatage du titre de la ligne avec as_paragraph(),
  • tabulation du contenu avec prepend_chunks(as_chunk("\t")),
  • remplacement des labels avec labelizor().
ft <- as_flextable(tab, spread_first_col = TRUE,
    row_title = as_paragraph(
      colorize("species: ", color = "#8f2218"),
      colorize(as_b(.row_title), color = "#8f2218")
    )) |> 
  colformat_double() |>
  align(j = 1, align = "left") |>
  prepend_chunks(i = ~ .is_row_title %in% FALSE, j = 1, as_chunk("\t")) |>
  labelizor(part = "header", labels = c(bill_depth_mm = "bill length\n(millimeters)", 
    body_mass_g = "body mass\n(grams)", island = "Island\nin Palmer\nArchipelago",
    n = "Number\nof\npenguins")) |>
  labelizor(part = "body", labels = stringr::str_to_title) |>
  autofit()
ft

Ajout dans un document

Il existe des méthodes simples permettant d’exporter un document flextable dans un document :

save_as_docx(ft, path = "flextable-tabular.docx")
save_as_rtf(ft, path = "flextable-tabular.rtf")
save_as_html(ft, path = "flextable-tabular.html")
save_as_image(ft, path = "flextable-tabular.png")
save_as_pptx(ft, path = "flextable-tabular.pptx")

Les fichiers peuvent être téléchargés à partir des liens suivants :

Gohel, David, and Panagiotis Skintzos. 2023. Flextable: Functions for Tabular Reporting. https://CRAN.R-project.org/package=flextable.
Horst, Allison, Alison Hill, and Kristen Gorman. 2022. Palmerpenguins: Palmer Archipelago (Antarctica) Penguin Data. https://CRAN.R-project.org/package=palmerpenguins.
Murdoch, Duncan. 2023. Tables: Formula-Driven Table Generation. https://dmurdoch.github.io/tables/.

Suivez nous:  -  Sites recommandés: R-bloggers R weekly Twitter #rstats Jobs for R-users