Demographic Tables avec flextable

Introduction

Les études cliniques commencent souvent par un tableau récapitulatif des caractéristiques démographiques des patients inclus dans l’étude afin de démontrer un équilibre entre les traitements et autres sous-groupes. Ce tableau se nomme “Demographic Tables”.

Le format est standard et peut être réalisé avec flextable en enchaînant 2 opérations.

Les deux étapes de la création de ces tableaux sont les suivantes :

  1. résumer l’information avec la fonction flextable::summarizor(). Elle calcule par groupes et pour chaque variables un ensemble de statistiques. Elle retourne un data.frame prêt à être consommé par flextable::as_flextable().
  2. Créer le flextable avec la fonction as_flextable() et le personnaliser éventuellement avec les fonctions de ‘flextable’.

Données d’exemple

library(flextable)
library(officer)
library(tidyverse)
library(safetyData)

use_df_printer()

set_flextable_defaults(
  border.color = "#AAAAAA", font.family = "Arial",
  font.size = 10, padding = 2, line_spacing = 1.5
)
adsl <- select(adam_adsl, AGE, SEX, BMIBLGR1, DURDIS, ARM)
adsl

Résumé de l’information

On va utiliser la fonction flextable::summarizor(). Elle produit un data.frame agrégé et structuré d’une façon idéale pour un affichage avec flextable.

dat <- summarizor(adsl, by = "ARM")
dat

Création du flextable

On souhaite un affichage où les traitements sont répartis en colonnes et où le contenu des paragraphes est assez souple pour permettre la création du tableau.

ft <- as_flextable(dat)
ft

La méthode flextable::as_flextable() supporte les arguments de la méthode flextable::tabulator(), on va utiliser l’argument spread_first_col = TRUE pour répartir les noms des variables comme lignes de séparation et ne plus afficher la colonne. On va aussi ajouter un caption et une note dans le bas du tableau et quelques paramétrages supplémentaires.

ft <- as_flextable(dat, spread_first_col = TRUE, separate_with = "variable") %>%
  bold(i = ~ !is.na(variable), j = 1, bold = TRUE) %>%
  set_caption(
    autonum = officer::run_autonum(seq_id = "tab", bkm = "demo_tab", bkm_all = FALSE),
    fp_p = officer::fp_par(text.align = "left", padding = 5),
    align_with_table = FALSE,
    caption = as_paragraph(
          "Demographic Characteristics",
          "\nx.x: Study Subject Data"
        )
  ) %>% 
  add_footer_lines("Source: ADaM adsl data frame from r package 'safetyData'") %>% 
  fix_border_issues() %>% 
  autofit()

ft

Ajout des libellés

Cette partie va permettre de récupérer un ensemble de libellés que nous allons utiliser pour remplacer certains textes affichés dans le flextable.

La fonction à utiliser est labelizor(), elle prend un simple argument sous forme de vecteur nommé, les noms sont les valeurs à remplacer, les valeurs sont les valeurs de remplacement.

On va récupérer les labels des colonnes stockées dans le tableau d’origine.

col_labels <- map_chr(adsl, function(x) attr(x, "label"))
col_labels
##                            AGE                            SEX 
##                          "Age"                          "Sex" 
##                       BMIBLGR1                         DURDIS 
##  "Pooled Baseline BMI Group 1" "Duration of Disease (Months)" 
##                            ARM 
##   "Description of Planned Arm"

ft <- labelizor(ft, j = "stat", labels = col_labels, part = "all")
ft

Ajout dans un document Word

On va préparer le tableau pour un export dans Word en ajoutant une ligne d’entête comportant le numéro de page. Le caption va être auto-numéroté et aligné à gauche dans le document.

ft %>%
  add_header_lines("Page ") %>%
  append_chunks(i = 1, part = "header", j = 1, as_word_field(x = "Page")) %>% 
  save_as_docx(path = "adsl.docx")

Le document Word produit peut être téléchargé ici : adsl.docx. La miniature ci-dessous montre le document attendu.

miniatures du document Word produit