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)

species

island

bill_depth_mm

body_mass_g

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

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()

species

island

bill_depth_mm

body_mass_g

n

Mean

Sd

Mean

Sd

Adelie

Biscoe

44

18.37

1.19

3'709.66

487.73

Dream

56

18.25

1.13

3'688.39

455.15

Torgersen

52

18.43

1.34

3'706.37

445.11

Chinstrap

Biscoe

0

Dream

68

18.42

1.14

3'733.09

384.34

Torgersen

0

Gentoo

Biscoe

124

14.98

0.98

5'076.02

504.12

Dream

0

Torgersen

0

All

Biscoe

168

15.87

1.82

4'716.02

782.86

Dream

124

18.34

1.13

3'712.90

416.64

Torgersen

52

18.43

1.34

3'706.37

445.11

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()

island

bill_depth_mm

body_mass_g

n

Mean

Sd

Mean

Sd

Adelie

Biscoe

44

18.37

1.19

3'709.66

487.73

Dream

56

18.25

1.13

3'688.39

455.15

Torgersen

52

18.43

1.34

3'706.37

445.11

Chinstrap

Biscoe

0

Dream

68

18.42

1.14

3'733.09

384.34

Torgersen

0

Gentoo

Biscoe

124

14.98

0.98

5'076.02

504.12

Dream

0

Torgersen

0

All

Biscoe

168

15.87

1.82

4'716.02

782.86

Dream

124

18.34

1.13

3'712.90

416.64

Torgersen

52

18.43

1.34

3'706.37

445.11

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

Island
in Palmer
Archipelago

bill length
(millimeters)

body mass
(grams)

Number
of
penguins

Mean

Sd

Mean

Sd

Species: Adelie

Biscoe

44

18.37

1.19

3'709.66

487.73

Dream

56

18.25

1.13

3'688.39

455.15

Torgersen

52

18.43

1.34

3'706.37

445.11

Species: Chinstrap

Biscoe

0

Dream

68

18.42

1.14

3'733.09

384.34

Torgersen

0

Species: Gentoo

Biscoe

124

14.98

0.98

5'076.02

504.12

Dream

0

Torgersen

0

Species: All

Biscoe

168

15.87

1.82

4'716.02

782.86

Dream

124

18.34

1.13

3'712.90

416.64

Torgersen

52

18.43

1.34

3'706.37

445.11

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