Ajouter des regroupements de colonnes facilement pour plus de lisibilité grâce à kableExtra

Dans la suite de l’article précédent où nous avions vu les mises en forme de base, je vais vous montrer comment utiliser les regroupements de colonnes.

le regroupement de colonnes

Il est courant dans les tables que certaines colonnes se réfèrent à un sujet connexe mais qui alourdit le nom dans l’entête.

Par exemple, voici la création d’une étude sur les effectifs d’un RSA selon le niveau de sévérité et le parcours RAAC pour la CMD 08 (pour la lisibilité, j’ai utilisé un kable("pipe") qui a l’avantage d’être plutôt présentable sous forme de texte. En tous les cas, il a ma préférence):

> t <- RSA %>% filter(RAAC !=" " & grepl("^08",RGHMOUT)) %>% count(RAAC,RGHMOUT,SEVOUT) %>% pivot_wider(names_from = c(RAAC,SEVOUT),values_from = n, values_fill = 0) %>% kable("pipe")

> t

|RGHMOUT | 0_1| 0_4| 0_J| 0_2| 0_3| 0_T| 0_Z| 1_1| 1_2| 1_3| 1_4| 2_2| 2_1|
|:-------|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|
|08C02   |   1|   0|   0|   0|   0|   0|   0|   0|   0|   0|   0|   0|   0|
|08C06   |   0|   1|   0|   0|   0|   0|   0|   0|   0|   0|   0|   0|   0|
|08C13   |   0|   0|   4|   0|   0|   0|   0|   0|   0|   0|   0|   0|   0|
|08C14   |   4|   0| 162|   0|   0|   0|   0|   0|   0|   0|   0|   0|   0|
|08C20   |   1|   0|   1|   0|   0|   0|   0|   0|   0|   0|   0|   0|   0|
|08C21   |   5|   1|  19|   0|   0|   0|   0|   0|   0|   0|   0|   0|   0|
|08C22   |  22|   3|   0|  18|   6|   0|   0|  17|   7|   3|   0|   1|   0|
<...>
R

Le rendu de base ne rend pas génial est est assez peu informatif (et je ne vous parle même pas du fait que pour faire court je n’ai pas classé par sévérité) :

avec un peu de styling kableExtra vu la fois précédente cela donne :

> t %>% kable_classic2
R

Ce qui pourrait aider à la lecture serait de regrouper les colonnes par l’explication de la valeur de RAAC. Entre en scène la fonction add_header_above().

add_header_above()

Je ne vous ferai pas le descriptif de toutes les options mais uniquement de la principale header=

Elle attend un vecteur nommé de nombre entiers correspondant au regroupement.

Ici, la valeur RAAC peut prendre 3 valeurs 0, 1 ou 2 et nous voulons par exemple les expliciter en « Hors RAAC », « RAAC » et « Non RAAC » (je sais la différence Hors/Non est ténue mais dépasse le périmètre de l’article). Nous spécifions alors la chaine de caractère et le nombre de colonnes à couvrir :

t %>% kable_classic2 %>% add_header_above(c("GHM"=1,"Hors RAAC"=7,"RAAC" = 4,"Non RAAC"=2))
R

Cela ne change pas la valeur originale des entêtes de colonne et donc n’améliore que partiellement.

Arrive donc la fonction suivante header_separate().

header_separate()

Cette fonction est particulièrement utile après un pivot_wider() contenant un vecteur dans names_from= comme ici.

Si on remplace le add_header_above() par head_separate() sans option, nous obtenons un entête plus clair et sans avoir à préciser manuellement ou par calcul le nombre de colonnes à couvrir :

t %>% kable_classic_2() %>% header_separate()
R

Il ne manque plus que de rendre parlant ces « 0 », « 1 », « 2 » en modifiant la génération des données. L’option sep= de header_separate() permet de fixer la chaine de caractère qui va être le séparateur des noms de regroupements. Par défaut, pivot_wider() utilise "_" (le tiret du 8 ou trait de soulignement). Pensez à le changer si vos noms de valeurs peuvent le contenir pour un autre caractère non trivial.

t1 <- RSA %>%
 filter(RAAC !=" " & grepl("^08",RGHMOUT)) %>%
 count(RAAC,RGHMOUT,SEVOUT) %>%
 mutate(RAAC = case_when(
                         RAAC == "0" ~ "Hors RAAC",
                         RAAC == "1" ~ "RAAC",
                         RAAC == "2" ~ "Non RAAC",
                         .default = "Hors RAAC"
                         )
       ) %>%
 pivot_wider(names_from = c(RAAC,SEVOUT),values_from = n, values_fill = 0) %>% kable("pipe")
R

Ce code utilise la fonction case_when() de dplyr qui est un équivalent de switch() vectorisé.

Maintenant l’usage de header_separate() avec son paramètre sep= réglé sur « _ » (sinon, il va « couper » à chaque espace).

t1 %>% kable_classic_2() %>% header_separate(sep = "_")
R

Ce qui nous donne :

Bravo, c’est ce qu’on cherchait !

Exercice

Afin que vous vous entrainiez, et sans nécésiter d’utiliser pivot_wider(), écrivez le code nécessaire pour sortir un tableau ayant cet aspect :

Il s’agit des premières colonnes des 10 premières lignes du RSA d’exemple, que j’utilise habituellement mais vous pouvez bien sûr utiliser le votre.

Conclusion

Nous venons d’apprendre comment regrouper facilement des colonnes pour les rendre plus lisibles. La prochaine fois, nous verrons comment ajouter une ligne de résumé (par exemple une somme des valeurs des colonnes).

D’ici-là, bon R à tous !

Un commentaire

  1. Pour les pressés, voici la réponse de l’exercice.

    RSA %>%
    select(« N°RSA » = NRSA, « GHM IN_N° » = RGHMIN, »GHM IN_Sév.° »=SEVIN, »GHM OUT_N° » = RGHMOUT, »GHM OUT_Sév. » = SEVOUT, Période_Mois = MOIS, Période_Anneé = ANNEE) %>%
    head(10) %>%
    kable(« pipe ») %>%
    header_separate(sep= »_ ») %>%
    kable_classic_2()

    Il s’agit de renommer les colonnes manuellement en rassemblant celles qui nous intéressent.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *