29  Présenter avec des tables

Hospital

Total cases with known outcome

Recovered

Died

Total

% of cases

Median CT values

Total

% of cases

Median CT values

St. Mark's Maternity Hospital (SMMH)

325

126

38.8%

22

199

61.2%

22

Central Hospital

358

165

46.1%

22

193

53.9%

22

Other

685

290

42.3%

21

395

57.7%

22

Military Hospital

708

309

43.6%

22

399

56.4%

21

Missing

1,125

514

45.7%

21

611

54.3%

21

Port Hospital

1,364

579

42.4%

21

785

57.6%

22

Total

3,440

1,469

42.7%

22

1,971

57.3%

22

Cette page montre comment synthétiser les données d’un tableau ou d’un fichier dans des tables prêtes à être présentées en utilisant le package flextable (on appelera ces tables les tables finales à présenter). Ces tables peuvent être insérées dans des diapositives Powerpoint, des pages HTML, des documents PDF ou Word, etc.

Comprenez qu’avant d’utiliser flextable, vous devez créer la table finale sous forme de tableau de données. Utilisez les méthodes décrites dans les pages Tables descriptives et Restructurer des données telles que les tabulations, les tableaux croisés, les pivots et le calcul de statistiques descriptives pour cela. Le tableau de données résultant peut ensuite être fourni à flextable pour le formatage de l’aspect de la table finale à présenter.

Il existe de nombreuses autres extensions (“packages”) R qui peuvent être utilisées pour créer des tables pour les présentations- nous avons choisi de mettre en avant flextable dans cette page. Un exemple d’utilisation du package knitr et de sa fonction kable() se trouve à la page Suivi de contacts. De même, le package DT est mis en avant dans la page Tableaux de bord avec Shiny. D’autres, comme GT et huxtable, sont mentionnés dans la page Packages suggérés.

29.1 Préparation

Charger les packages

Installer et charger flextable. Dans ce manuel, nous mettons l’accent sur la fonction p_load() du “package” pacman, qui installe le (ou une liste de) “package (s)” que si nécessaire (uniquement si le package n’est pas déjà installé) et le charge pour l’utiliser . Vous pouvez également charger des “packages” avec library() à partir de R base. Voir la page sur Bases de R pour plus d’informations sur les “packages” R.

pacman::p_load(
  rio,            # importer/exporter
  here,           # chemin vers les fichiers
  flextable,      # creer des tables HTML  
  officer,        # fonctions d'aide pour les tables
  tidyverse)      # data management, resume, et visualisation

Importer des données

Pour commencer, nous importons la liste linéaire (“linelist”) nettoyée des cas d’une épidémie d’Ebola qui a été simulée. Si vous voulez suivre en travaillant sur la base, cliquez pour télécharger la version “clean” (en fichier .rds). Importez les données avec la fonction import() du “package” rio (elle gère de nombreux types de fichiers comme .xlsx, .csv, .rds - voir la page Importation et exportation pour plus de détails).

# importer la liste lineaire
linelist <- import("linelist_cleaned.rds")

Les 50 premières lignes de la liste linéaire sont affichées ci-dessous.

Préparer la table

Comme expliqué plus haut, avant de commencer à utiliser flextable, vous devez d’abord créer la table que vous voulez présenter sous forme de tableau de données. Consultez la page sur les Tables descriptives et les Données pivotantes pour apprendre à créer un tableau de données à l’aide de “packages” tels que janitor et dplyr. Vous devez disposer le contenu en lignes et en colonnes comme vous voulez qu’il soit affiché. C’est à dire on part de notre base de données principales, on lui applique les modifications et opérations nécessaires pour synthétiser l’information que l’on veut présenter dans notre table finale et ce résultat sera enregistré dans un tableu de données. Ensuite, ce tableau de données sera soumis à flextable pour l’afficher avec la mise en forme voulue ajoutant des couleurs, des en-têtes, des polices, etc.

Voici un exemple tiré de la page Tables descriptives sur la conversion de la “liste linéaire des cas” en un tableau de données qui résume/synthétise l’issue finale des patients et les valeurs CT (seuil de cycle dans un test de détection du virus par PCR) par hôpital, avec une ligne de totaux en bas. Le résultat est enregistré sous le nom de table.

table <- linelist %>% 
  
  # Obtenez les valeurs résumees par hôpital et issue finale
  ###############################################
  group_by(hospital, outcome) %>%                      # Grouper les donnees selon ces deux variables
  summarise(                                           # Creer un nouveau résumé des variables d'intérêt 
    N = n(),                                            # Nombre de lignes par  groupe "hospital-outcome"     
    ct_value = median(ct_blood, na.rm=T)) %>%           # Valeur CT mediane  par groupe
  
  # ajouter le total
  ############
  bind_rows(                                           # Liez le tableau précédent avec ce mini-tableau de totaux
    linelist %>% 
      filter(!is.na(outcome) & hospital != "Missing") %>%
      group_by(outcome) %>%                            # Grouper avec var "outcome" uniquement et non par  "hospital"    
      summarise(
        N = n(),                                       # Nombre de lignes pour l'ensemble des données    
        ct_value = median(ct_blood, na.rm=T))) %>%     # Valeur CT mediane pour l'ensemble des données    
  
  # Modifier en format long-large
  ########################
  mutate(hospital = replace_na(hospital, "Total")) %>% 
  pivot_wider(                                         # Pivoter du format long au format large
    values_from = c(ct_value, N),                       # nouvelles valeurs sont crees depuis les vars "ct" et "count"
    names_from = outcome) %>%                           # nouveaux noms de colonne crees depuis var "outcomes"
  mutate(                                              # Creer de nouvelles colonnes
    N_Known = N_Death + N_Recover,                               # nombre de cas avec l'issue finale connue
    Pct_Death = scales::percent(N_Death / N_Known, 0.1),         # pourcentage de cas decedes (1 decimale)
    Pct_Recover = scales::percent(N_Recover / N_Known, 0.1)) %>% # pourcentage de cas gueris (1 decimale)
  select(                                              # Re-ordonner l'apparition des colonnes
    hospital, N_Known,                                   # Colonnes d'Intro
    N_Recover, Pct_Recover, ct_value_Recover,            # Colonnes concernant les gueris
    N_Death, Pct_Death, ct_value_Death)  %>%             # Colonnes concernant les deces
  arrange(N_Known)                                    # Trier les lignes de façon croissante (Total de la ligne en dernier)

table  # afficher la table
# A tibble: 7 × 8
# Groups:   hospital [7]
  hospital      N_Known N_Recover Pct_Recover ct_value_Recover N_Death Pct_Death
  <chr>           <int>     <int> <chr>                  <dbl>   <int> <chr>    
1 St. Mark's M…     325       126 38.8%                     22     199 61.2%    
2 Central Hosp…     358       165 46.1%                     22     193 53.9%    
3 Other             685       290 42.3%                     21     395 57.7%    
4 Military Hos…     708       309 43.6%                     22     399 56.4%    
5 Missing          1125       514 45.7%                     21     611 54.3%    
6 Port Hospital    1364       579 42.4%                     21     785 57.6%    
7 Total            3440      1469 42.7%                     22    1971 57.3%    
# ℹ 1 more variable: ct_value_Death <dbl>

29.2 Premiers pas avec flextable

Créer un objet flextable

Pour créer et gérer les objets flextable, nous passons d’abord le tableau de données avec les informqtions que nous voulons présenter par la fonction flextable() et nous enregistrons le résultat sous le nom de my_table.

my_table <- flextable(table) 
my_table

hospital

N_Known

N_Recover

Pct_Recover

ct_value_Recover

N_Death

Pct_Death

ct_value_Death

St. Mark's Maternity Hospital (SMMH)

325

126

38.8%

22

199

61.2%

22

Central Hospital

358

165

46.1%

22

193

53.9%

22

Other

685

290

42.3%

21

395

57.7%

22

Military Hospital

708

309

43.6%

22

399

56.4%

21

Missing

1,125

514

45.7%

21

611

54.3%

21

Port Hospital

1,364

579

42.4%

21

785

57.6%

22

Total

3,440

1,469

42.7%

22

1,971

57.3%

22

Après avoir fait cela, nous pouvons progressivement faire passer l’objet my_table par plus de fonctions de formatage flextable.

Dans cette page, pour des raisons de clarté, nous sauvegarderons la table à des étapes intermédiaires sous le nom de my_table, en ajoutant des fonctions flextable étape par étape. Si vous voulez voir tout le code du début à la fin écrit en un seul bloc, visitez la section Tout le code ensemble ci-dessous.

La syntaxe générale de chaque ligne de code flextable est la suivante :

  • function(table, i = X, j = X, part = "X"), where:

    • La “fonction” peut être l’une des nombreuses fonctions différentes, telles que width() pour déterminer la largeur des colonnes, bg() pour définir les couleurs d’arrière-plan, align() pour définir si le texte est aligné au centre/à droite/à gauche, et ainsi de suite.
    • table = est le nom du tableau de données, mais il n’est pas nécessaire de l’indiquer si le tableau de données est intégré à la fonction.
    • part = indique la partie de la table à laquelle la fonction appelée sera appliqué. Par ex: “header” pour l’entête de la table, “body” pour le corps de la table ou “all” pour toutes les parties de la table.
    • i = spécifie la ligne à laquelle appliquer la fonction, où ‘X’ est le numéro de la ligne. S’il s’agit de plusieurs lignes, par exemple de la première à la troisième ligne, on peut spécifier : i = c(1:3). Notez que si ‘body’ est sélectionné, la première ligne commence sous la section d’en-tête.
    • j = spécifie la colonne à laquelle appliquer la fonction, où ‘x’ est le numéro ou le nom de la colonne. Si plusieurs colonnes, par exemple la cinquième et la sixième, on peut spécifier : `j = c(5,6).

Vous pouvez trouver la liste complète des fonctions de formatage flextable ici ou consulter la documentation en tapant ?flextable.

Largeur de la colonne

Nous pouvons utiliser la fonction autofit(), qui permet d’étirer et de réajuster la table de façon esthétique de sorte que chaque cellule ne comporte qu’une seule ligne de texte. La fonction qflextable() est un raccourci pratique pour flextable() et autofit().

my_table %>% autofit()

hospital

N_Known

N_Recover

Pct_Recover

ct_value_Recover

N_Death

Pct_Death

ct_value_Death

St. Mark's Maternity Hospital (SMMH)

325

126

38.8%

22

199

61.2%

22

Central Hospital

358

165

46.1%

22

193

53.9%

22

Other

685

290

42.3%

21

395

57.7%

22

Military Hospital

708

309

43.6%

22

399

56.4%

21

Missing

1,125

514

45.7%

21

611

54.3%

21

Port Hospital

1,364

579

42.4%

21

785

57.6%

22

Total

3,440

1,469

42.7%

22

1,971

57.3%

22

Cependant, cela n’est pas toujours approprié, surtout si les cellules contiennent des valeurs très longues, ce qui signifie que le tableau risque de ne pas tenir sur la page.

À la place, nous pouvons spécifier des largeurs avec la fonction width(). Il faut parfois essayer plusieurs valeurs pour savoir laquelle correspond le mieux. Dans l’exemple ci-dessous, nous spécifions des largeurs différentes pour la colonne 1, la colonne 2 et les colonnes 4 à 8.

my_table <- my_table %>% 
  width(j=1, width = 2.7) %>% 
  width(j=2, width = 1.5) %>% 
  width(j=c(4,5,7,8), width = 1)

my_table

hospital

N_Known

N_Recover

Pct_Recover

ct_value_Recover

N_Death

Pct_Death

ct_value_Death

St. Mark's Maternity Hospital (SMMH)

325

126

38.8%

22

199

61.2%

22

Central Hospital

358

165

46.1%

22

193

53.9%

22

Other

685

290

42.3%

21

395

57.7%

22

Military Hospital

708

309

43.6%

22

399

56.4%

21

Missing

1,125

514

45.7%

21

611

54.3%

21

Port Hospital

1,364

579

42.4%

21

785

57.6%

22

Total

3,440

1,469

42.7%

22

1,971

57.3%

22

En-têtes de colonnes

Nous voulons des en-têtes plus clairs pour faciliter l’interprétation du contenu du tableau.

Pour cette table, nous voudrons ajouter une deuxième couche d’en-tête afin que les colonnes couvrant les mêmes sous-groupes puissent être regroupées. Nous faisons cela avec la fonction add_header_row() avec top = TRUE. Nous précisons le nouveau nom de chaque colonne avec l’option values =, en laissant des valeurs vides "" pour les colonnes que nous savons que nous fusionnerons plus tard.

Nous renommons également les noms des en-têtes dans le désormais deuxième en-tête dans une commande séparée en utilisant set_header_labels().

Enfin, pour “regrouper” certains en-têtes de colonnes dans l’en-tête supérieur, nous utilisons merge_at() pour fusionner les en-têtes de colonnes dans la ligne d’en-tête supérieure.

my_table <- my_table %>% 
  
  add_header_row(
    top = TRUE,                # Nouvel en-tête placé au-dessus de la rangée d'en-tête existante
    values = c("Hospital",     # Valeurs d'en-tête pour chaque colonne ci-dessous
               "Total cases with known outcome", 
               "Recovered",    # Celui ci servira d'en-tête de niveau supérieur pour cette colonne et les deux suivantes
               "",
               "",
               "Died",         # Celui ci servira d'en-tête de niveau supérieur pour cette colonne et les deux suivantes
               "",             # Laisser vide comme ce sera fusionné avec "Died".
               "")) %>% 
    
  set_header_labels(         # Renommer les colonnes de la ligne d'en-tête originale
      hospital = "", 
      N_Known = "",                  
      N_Recover = "Total",
      Pct_Recover = "% of cases",
      ct_value_Recover = "Median CT values",
      N_Death = "Total",
      Pct_Death = "% of cases",
      ct_value_Death = "Median CT values")  %>% 
  
  merge_at(i = 1, j = 3:5, part = "header") %>% # Fusionner horizontalement les colonnes 3 à 5 dans une nouvelle ligne d'en-tête
  merge_at(i = 1, j = 6:8, part = "header")     # Fusionnez horizontalement les colonnes 6 à 8 dans une nouvelle ligne d'en-tête.

my_table  # afficher la table résultante

Hospital

Total cases with known outcome

Recovered

Died

Total

% of cases

Median CT values

Total

% of cases

Median CT values

St. Mark's Maternity Hospital (SMMH)

325

126

38.8%

22

199

61.2%

22

Central Hospital

358

165

46.1%

22

193

53.9%

22

Other

685

290

42.3%

21

395

57.7%

22

Military Hospital

708

309

43.6%

22

399

56.4%

21

Missing

1,125

514

45.7%

21

611

54.3%

21

Port Hospital

1,364

579

42.4%

21

785

57.6%

22

Total

3,440

1,469

42.7%

22

1,971

57.3%

22

Bordures et arrière-plan

Vous pouvez ajuster les bordures, les lignes internes, etc. avec diverses fonctions flextable. Il est souvent plus facile de commencer par supprimer toutes les bordures existantes avec border_remove().

Ensuite, vous pouvez appliquer des thèmes de bordure par défaut en passant la table à theme_box(), theme_booktabs(), ou theme_alafoli().

Vous pouvez ajouter des lignes verticales et horizontales avec une variété de fonctions. hline() et vline() ajoutent des lignes à une ligne ou une colonne spécifiée, respectivement. Dans chacune d’elles, vous devez spécifier dans quelle partie de la table vous voulez le rajouter en précisant part = comme étant soit “all”,“body” ou “header”. Pour les lignes verticales, spécifiez la colonne à l’argument j =, et pour les lignes horizontales la ligne à i =. D’autres fonctions comme vline_right(), vline_left(), hline_top(), et hline_bottom() ajoutent des lignes aux bords externes de la table seulement.

Dans toutes ces fonctions, le style de ligne lui-même doit être spécifié par border = et doit être le résultat d’une commande séparée utilisant la fonction fp_border() du “package” officer. Cette fonction vous aide à définir la largeur et la couleur de la ligne. Vous pouvez la définir avant d’appeler les commandes de table, comme indiqué ci-dessous.

# définir le style de la ligne de bordure
border_style = officer::fp_border(color="black", width=1)

# ajouter des lignes de bordure au tableau
my_table <- my_table %>% 

  # Enlever toutes les bordures existantes
  border_remove() %>%  
  
  # ajouter des lignes horizontales via un thème prédéterminé
  theme_booktabs() %>% 
  
  # ajouter des lignes verticales pour séparer les sections "Recovered" et "Died"
  vline(part = "all", j = 2, border = border_style) %>%   # a la colonne 2 
  vline(part = "all", j = 5, border = border_style)       # a la colonne 5

my_table

Hospital

Total cases with known outcome

Recovered

Died

Total

% of cases

Median CT values

Total

% of cases

Median CT values

St. Mark's Maternity Hospital (SMMH)

325

126

38.8%

22

199

61.2%

22

Central Hospital

358

165

46.1%

22

193

53.9%

22

Other

685

290

42.3%

21

395

57.7%

22

Military Hospital

708

309

43.6%

22

399

56.4%

21

Missing

1,125

514

45.7%

21

611

54.3%

21

Port Hospital

1,364

579

42.4%

21

785

57.6%

22

Total

3,440

1,469

42.7%

22

1,971

57.3%

22

Police et alignement

Nous alignons au centre toutes les colonnes, sauf la colonne la plus à gauche, avec les noms des hôpitaux, en utilisant la fonction align() de flextable.

my_table <- my_table %>% 
   flextable::align(align = "center", j = c(2:8), part = "all") 
my_table

Hospital

Total cases with known outcome

Recovered

Died

Total

% of cases

Median CT values

Total

% of cases

Median CT values

St. Mark's Maternity Hospital (SMMH)

325

126

38.8%

22

199

61.2%

22

Central Hospital

358

165

46.1%

22

193

53.9%

22

Other

685

290

42.3%

21

395

57.7%

22

Military Hospital

708

309

43.6%

22

399

56.4%

21

Missing

1,125

514

45.7%

21

611

54.3%

21

Port Hospital

1,364

579

42.4%

21

785

57.6%

22

Total

3,440

1,469

42.7%

22

1,971

57.3%

22

De plus, nous pouvons augmenter la taille de la police de l’en-tête et la mettre en gras. Nous pouvons également mettre en gras la ligne du total.

my_table <-  my_table %>%  
  fontsize(i = 1, size = 12, part = "header") %>%   # ajuster la taille de la police de l'en-tête
  bold(i = 1, bold = TRUE, part = "header") %>%     # ajuster le caractère en gras de l'en-tête
  bold(i = 7, bold = TRUE, part = "body")           # ajuster les caractères en gras de la ligne totale (ligne 7 du corps de la table)

my_table

Hospital

Total cases with known outcome

Recovered

Died

Total

% of cases

Median CT values

Total

% of cases

Median CT values

St. Mark's Maternity Hospital (SMMH)

325

126

38.8%

22

199

61.2%

22

Central Hospital

358

165

46.1%

22

193

53.9%

22

Other

685

290

42.3%

21

395

57.7%

22

Military Hospital

708

309

43.6%

22

399

56.4%

21

Missing

1,125

514

45.7%

21

611

54.3%

21

Port Hospital

1,364

579

42.4%

21

785

57.6%

22

Total

3,440

1,469

42.7%

22

1,971

57.3%

22

Pour aérer la table, nous pouvons nous assurer que les colonnes de proportion n’affichent qu’une seule décimale en utilisant la fonction colformat_num(). Notez que cela aurait également pu être fait au stade de la gestion des données dans le tableau de données créé et fourni à flextable() avec la fonction round().

my_table <- colformat_num(my_table, j = c(4,7), digits = 1)
my_table

Hospital

Total cases with known outcome

Recovered

Died

Total

% of cases

Median CT values

Total

% of cases

Median CT values

St. Mark's Maternity Hospital (SMMH)

325

126

38.8%

22

199

61.2%

22

Central Hospital

358

165

46.1%

22

193

53.9%

22

Other

685

290

42.3%

21

395

57.7%

22

Military Hospital

708

309

43.6%

22

399

56.4%

21

Missing

1,125

514

45.7%

21

611

54.3%

21

Port Hospital

1,364

579

42.4%

21

785

57.6%

22

Total

3,440

1,469

42.7%

22

1,971

57.3%

22

Fusionner des cellules

Tout comme nous fusionnons les cellules horizontalement dans la ligne d’en-tête, nous pouvons également fusionner les cellules verticalement en utilisant merge_at() et en spécifiant les lignes (i) et les colonnes (j). Ici, nous fusionnons les valeurs “Hospital” et “Total cases with known outcome” verticalement pour leur donner plus d’espace.

my_table <- my_table %>% 
  merge_at(i = 1:2, j = 1, part = "header") %>% 
  merge_at(i = 1:2, j = 2, part = "header")

my_table

Hospital

Total cases with known outcome

Recovered

Died

Total

% of cases

Median CT values

Total

% of cases

Median CT values

St. Mark's Maternity Hospital (SMMH)

325

126

38.8%

22

199

61.2%

22

Central Hospital

358

165

46.1%

22

193

53.9%

22

Other

685

290

42.3%

21

395

57.7%

22

Military Hospital

708

309

43.6%

22

399

56.4%

21

Missing

1,125

514

45.7%

21

611

54.3%

21

Port Hospital

1,364

579

42.4%

21

785

57.6%

22

Total

3,440

1,469

42.7%

22

1,971

57.3%

22

Couleur d’arrière-plan

Pour distinguer le contenu du corps de la table des en-têtes, nous pouvons ajouter une mise en forme supplémentaire, par exemple en modifiant la couleur de l’arrière-plan. Dans cet exemple, nous changeons le corps du tableau en gris.

my_table <- my_table %>% 
    bg(part = "body", bg = "gray95")  

my_table 

Hospital

Total cases with known outcome

Recovered

Died

Total

% of cases

Median CT values

Total

% of cases

Median CT values

St. Mark's Maternity Hospital (SMMH)

325

126

38.8%

22

199

61.2%

22

Central Hospital

358

165

46.1%

22

193

53.9%

22

Other

685

290

42.3%

21

395

57.7%

22

Military Hospital

708

309

43.6%

22

399

56.4%

21

Missing

1,125

514

45.7%

21

611

54.3%

21

Port Hospital

1,364

579

42.4%

21

785

57.6%

22

Total

3,440

1,469

42.7%

22

1,971

57.3%

22

29.3 Mise en forme conditionnelle

L’un des points forts de flextable est qu’il nous permet de faire des mises en forme de notre table finale selon des conditions que nous aurons fixées selon l’information que nous voulons souligner. Nous pouvons ainsi donc mettre en évidence toutes les valeurs d’une colonne qui répondent à une certaine condition. Par exemple nous voulons mettre l’accent sur les cas où plus de 55 % des cas sont décédés. Il suffit de mettre les critères dans l’argument i = ou j =, précédé d’un tilde ~. Attention: la condition doit être précisée en utilisant le nom de la colonne (variable) dans le tableau de donnée fourni à flextable() non en utilisant le nom de la colonne qui s’affiche dans l’en-tête de la table finale.

my_table %>% 
  bg(j = 7, i = ~ Pct_Death >= 55, part = "body", bg = "red") 

Hospital

Total cases with known outcome

Recovered

Died

Total

% of cases

Median CT values

Total

% of cases

Median CT values

St. Mark's Maternity Hospital (SMMH)

325

126

38.8%

22

199

61.2%

22

Central Hospital

358

165

46.1%

22

193

53.9%

22

Other

685

290

42.3%

21

395

57.7%

22

Military Hospital

708

309

43.6%

22

399

56.4%

21

Missing

1,125

514

45.7%

21

611

54.3%

21

Port Hospital

1,364

579

42.4%

21

785

57.6%

22

Total

3,440

1,469

42.7%

22

1,971

57.3%

22

Ou bien, nous pouvons mettre en évidence la ligne entière répondant à un certain critère, tel qu’un hôpital d’intérêt. Pour ce faire, il suffit de supprimer la spécification de la colonne (j) afin que les critères s’appliquent à toutes les colonnes.

my_table %>% 
  bg(., i= ~ hospital == "Military Hospital", part = "body", bg = "#91c293") 

Hospital

Total cases with known outcome

Recovered

Died

Total

% of cases

Median CT values

Total

% of cases

Median CT values

St. Mark's Maternity Hospital (SMMH)

325

126

38.8%

22

199

61.2%

22

Central Hospital

358

165

46.1%

22

193

53.9%

22

Other

685

290

42.3%

21

395

57.7%

22

Military Hospital

708

309

43.6%

22

399

56.4%

21

Missing

1,125

514

45.7%

21

611

54.3%

21

Port Hospital

1,364

579

42.4%

21

785

57.6%

22

Total

3,440

1,469

42.7%

22

1,971

57.3%

22

29.4 L’ensemble du code

Ci-dessous, nous regroupons tout le code des sections précédentes en un seul bloc comme vous serez amené à le faire.

border_style = officer::fp_border(color="black", width=1)

pacman::p_load(
  rio,            # importer/exporter
  here,           # chemin vers les fichiers
  flextable,      # creer des tables HTML 
  officer,        # fonctions d'aide pour les tables
  tidyverse)      # data management, resume, et visualisation

table <- linelist %>% 

  # Obtenez les valeurs résumees par hôpital et issue finale
  ###############################################
  group_by(hospital, outcome) %>%                      # Grouper les donnees selon ces deux variables
  summarise(                                           # Creer un nouveau résumé des variables d'intérêt
    N = n(),                                            # Nombre de lignes par  groupe "hospital-outcome"
    ct_value = median(ct_blood, na.rm=T)) %>%           # Valeur CT mediane  par groupe
  
  # add totals
  ############
  bind_rows(                                           # Liez le tableau précédent avec ce mini-tableau de totaux
    linelist %>% 
      filter(!is.na(outcome) & hospital != "Missing") %>%
      group_by(outcome) %>%                            # # Grouper avec var "outcome" uniquement et non par  "hospital"    
      summarise(
        N = n(),                                       # Nombre de lignes pour l'ensemble des données      
        ct_value = median(ct_blood, na.rm=T))) %>%     # Valeur CT mediane pour l'ensemble des données
  
  # Passer du format long de la table au format large
  ########################
  mutate(hospital = replace_na(hospital, "Total")) %>% 
  pivot_wider(                                         # Pivoter du format long au format large
    values_from = c(ct_value, N),                       # nouvelles valeurs sont crees depuis les vars "ct" et "count"
    names_from = outcome) %>%                           # nouveaux noms de colonne crees depuis var "outcomes"
  mutate(                                              # Creer de nouvelles colonnes
    N_Known = N_Death + N_Recover,                               # nombre de cas avec l'issue finale connue
    Pct_Death = scales::percent(N_Death / N_Known, 0.1),         # pourcentage de cas decedes (1 decimale)
    Pct_Recover = scales::percent(N_Recover / N_Known, 0.1)) %>% # pourcentage de cas gueris (1 decimale)
  select(                                              # Re-ordonner l'apparition des colonnes
    hospital, N_Known,                                   # Colonnes d'Intro
    N_Recover, Pct_Recover, ct_value_Recover,            # Colonnes concernant les gueris
    N_Death, Pct_Death, ct_value_Death)  %>%             # Colonnes concernant les deces
  arrange(N_Known) %>%                                 # Trier les lignes de façon croissante (Total de la ligne en dernier)

  # formatting
  ############
  flextable() %>%              # la table est pippee depuis les codes ci-dessus
  add_header_row(
    top = TRUE,                # Nouvel en-tête placé au-dessus de la rangée d'en-tête existante
    values = c("Hospital",     # Valeurs d'en-tête pour chaque colonne ci-dessous
               "Total cases with known outcome", 
               "Recovered",    # Celui ci servira d'en-tête de niveau supérieur pour cette colonne
               "",
               "",
               "Died",         # Celui ci servira d'en-tête de niveau supérieur pour cette colonne
               "",             # Laisser vide comme ce sera fusionné avec "Died"
               "")) %>% 
    set_header_labels(         # Renommer les colonnes de la ligne d'en-tête originale
      hospital = "", 
      N_Known = "",                  
      N_Recover = "Total",
      Pct_Recover = "% of cases",
      ct_value_Recover = "Median CT values",
      N_Death = "Total",
      Pct_Death = "% of cases",
      ct_value_Death = "Median CT values")  %>% 
  merge_at(i = 1, j = 3:5, part = "header") %>% # Fusionner horizontalement les colonnes 3 à 5 dans une nouvelle ligne d'en-tête
  merge_at(i = 1, j = 6:8, part = "header") %>%  
  border_remove() %>%  
  theme_booktabs() %>% 
  vline(part = "all", j = 2, border = border_style) %>%   # at column 2 
  vline(part = "all", j = 5, border = border_style) %>%   # at column 5
  merge_at(i = 1:2, j = 1, part = "header") %>% 
  merge_at(i = 1:2, j = 2, part = "header") %>% 
  width(j=1, width = 2.7) %>% 
  width(j=2, width = 1.5) %>% 
  width(j=c(4,5,7,8), width = 1) %>% 
  flextable::align(., align = "center", j = c(2:8), part = "all") %>% 
  bg(., part = "body", bg = "gray95")  %>% 
  bg(., j=c(1:8), i= ~ hospital == "Military Hospital", part = "body", bg = "#91c293") %>% 
  colformat_num(., j = c(4,7), digits = 1) %>%
  bold(i = 1, bold = TRUE, part = "header") %>% 
  bold(i = 7, bold = TRUE, part = "body")
`summarise()` has grouped output by 'hospital'. You can override using the
`.groups` argument.
table

Hospital

Total cases with known outcome

Recovered

Died

Total

% of cases

Median CT values

Total

% of cases

Median CT values

St. Mark's Maternity Hospital (SMMH)

325

126

38.8%

22

199

61.2%

22

Central Hospital

358

165

46.1%

22

193

53.9%

22

Other

685

290

42.3%

21

395

57.7%

22

Military Hospital

708

309

43.6%

22

399

56.4%

21

Missing

1,125

514

45.7%

21

611

54.3%

21

Port Hospital

1,364

579

42.4%

21

785

57.6%

22

Total

3,440

1,469

42.7%

22

1,971

57.3%

22

29.5 Sauvegarder votre table

Il existe différentes façons d’intégrer la table finale dans votre production.

Sauvegarder une seule table

Vous pouvez exporter les tableaux vers des fichiers Word, PowerPoint ou HTML ou sous format image (PNG). Pour ce faire, utilisez l’une des fonctions suivantes :

  • save_as_docx()
  • save_as_pptx()
  • save_as_image()
  • save_as_html()

Par exemple, ci-dessous, nous enregistrons notre table comme un document Word. Notez la syntaxe du premier argument - vous pouvez simplement fournir le nom de votre objet flextable, par exemple my_table, ou vous pouvez lui donner un “nom” comme indiqué ci-dessous (le nom est “my table”). Si vous lui donnez un nom, celui-ci apparaîtra comme le titre de la table dans le document Word. Nous fournissons également le code pour sauvegarder la table sous format image PNG.

# Modifiez le tableau "my table" en fonction des besoins pour le titre du tableau.  
save_as_docx("my table" = my_table, path = "file.docx")

save_as_image(my_table, path = "file.png")

Notez que les “packages” webshot ou webshot2 sont nécessaires pour sauvegarder un flextable comme une image. Les images peuvent sortir avec des arrière-plans transparents.

Si vous voulez voir une version “en direct” de la sortie du flextable dans le format de document prévu, utilisez print() et spécifiez un des éléments ci-dessous pour preview =. Le document s’ouvrira “en direct” sur votre ordinateur dans le logiciel spécifié, mais ne sera pas sauvegardé. Cela peut être utile pour vérifier si le tableau tient dans une page/diapositive ou pour le copier rapidement dans un autre document. Vous pouvez utiliser la méthode d’impression avec l’argument preview défini à “pptx” ou “docx”.

print(my_table, preview = "docx") # Exemple de document Word
print(my_table, preview = "pptx") # Exemple de document Powerpoint

Intégrer la table dans R markdown

Cette table peut être intégrée dans un document automatisé, une sortie R markdown, si l’objet table est appelé dans le chunk R markdown. Cela signifie que la table peut être mise à jour dans le cadre d’un rapport où les données sont susceptibles de changer, de sorte que les chiffres peuvent être actualisés.

Voir les détails dans la page Rapports avec R Markdown de ce manuel.

29.6 Ressources

La documentation compléte sur flextable est ici: https://ardata-fr.github.io/flextable-book/ Le lien Github est ici
Un guide sur toutes les fonctions flextable peût être trouvée ici

Vous pouvez accéder à une galerie de beaux exemples de tables flextable avec code ici