Fondamentaux de forcats
forcats est un package du tidyverse (ensemble de packages cohérents de R). Il sert à gérer, transformer et réorganiser simplement les facteurs.
Utilité
En R, les variables catégorielles (facteurs) se caractérisent ainsi :
- elles possèdent des modalités (levels)
- et surtout un ordre éventuel.
Exemple :
sexe <- factor(c("H", "F", "F", "H"))
Problèmes :
- Gérer les niveaux à la main est souvent pénible.
- Les erreurs sont fréquentes (ordre incorrect, niveaux inutiles, etc.).
D’où l’utilité de forcast qui va simplifier tout ça…
Modalités réordonnées
Il est souvent utile de réordonner les modalités, par exemple pour réaliser un graphique.
library(forcats)
fct_reorder(variable, autre_variable)
Prenons un exemple pour bien fixer les idées. Imaginons des données de ventes par catégorie d'articles.
library(dplyr)
library(forcats)
df <- data.frame(
categorie = c("Informatique", "Alimentaire", "Vêtements", "Informatique", "Alimentaire", "Vêtements", "Alimentaire"),
ventes = c(200, 50, 120, 180, 60, 100, 70)
)
Nous avons importé le package dplyr car nous aurons besoin des fonctions summarise() et group_by().
Si l'on calcule les ventes totales par catégorie :
df_resume <- df %>%
group_by(categorie) %>%
summarise(total = sum(ventes))
On obtient :
categorie total
Alimentaire 180
Informatique 380
Vêtements 220
Mais l’ordre est alphabétique, pas informatif ! Nous souhaitons présenter ces catégories en ordre décroissant.
df_resume <- df_resume %>%
mutate(categorie = fct_reorder(categorie, total, .desc = TRUE))
Ainsi fct_reorder prend un facteur (categorie) et le réordonne selon une variable (total). Par défaut, l’ordre est croissant mais ici nous avons ajouté une instruction d’ordre décroissant.
Mais le plus simple est de réordonner avant le résumé.
df %>%
mutate(categorie = fct_reorder(categorie, ventes, .fun = sum, .desc = TRUE)) %>%
group_by(categorie) %>%
summarise(total = sum(ventes))
Résultat : les niveaux du facteur categorie sont ordonnés selon le total des ventes, du plus élevé au plus faible, avant même summarise().
À ce stade (avant group_by()), chaque catégorie apparaît plusieurs fois. Donc pour décider de l’ordre, il faut résumer temporairement les valeurs associées à chaque modalité. C’est le rôle de .fun.
Nous avons choisi .fun = sum mais nous aurions pu choisir un autre critère que la somme :
Pour conclure, on a le choix entre summarise puis reorder (explicite pour les débutants) ou mutate et fct_recorder (plus professionnel).
Enfin, si fct_reorder() laisse à R tout le travail du nouvel ordonnancement, c’est la fonction fct_relevel() qui permet à l’utilisateur de choisir soit l’ordre de toutes les modalités, soit de la première seulement.
Exemple : avec fct_relevel(variable, "B", "A", "C") on impose que soit d’abord présenté B, puis A puis C. Si nous n’avions indiqué que B, alors cette modalité aurait été la première et les autres auraient conservé leur ordre.
Cas d’usage typiques :
- définir une catégorie de référence (modèles statistiques),
- placer Autre à la fin,
- imposer un ordre logique, par exemple : Faible, Moyen, Élevé.
Modification des niveaux
On peut renommer :
fct_recode(sexe, Homme = "H", Femme = "F")
On peut aussi regrouper certaines classes entre elles :
fct_collapse(variable,
groupe1 = c("A", "B"),
groupe2 = c("C", "D")
)

On peut aussi regrouper des modalités rares. fct_lump() sert à les réunir en une même catégorie, appelée Other par défaut.
Quelques exemples :
- fct_lump(x, n = 3) permet de conserver les trois modalités les plus fréquentes et de regrouper les autres.
- fct_lump(x, prop = 0.2) garde les catégories qui représentent au moins \(20\%\) de la population et regroupe les autres.
- fct_lump(x, n = 2, other_level = "Autres") conserve les catégories dont l’effectif est au moins égal à 2 (et regroupe toutes celles dont l’effectif est unique). Ici, nous avons souhaité appeler la catégorie de regroupement Autres plutôt que Others.
Supprimer les niveaux inutilisés
fct_drop(variable)
Nous ne développerons pas cette fonction, un peu plus technique que les autres. Des catégories peuvent exister dans les niveaux du facteur mais ne pas apparaître, par exemple à la suite d’un filtrage. Il faut parfois les supprimer pour ne pas perturber les traitements ultérieurs (graphiques, tableaux, jointures, nombre de variables dans une étude statistique…). En base R, on utilise droplevels(variable).