4 Les facteurs

En R, un facteur (factor, en anglais) est un vecteur dont les éléments ne peuvent prendre que des modalités prédéfinies. Ce qui caractérise un facteur en R est le fait qu’elle dispose de l’attribut Levels (niveaux). En pratique, un facteur est typiquement utilisé pour stocker les valeurs observées d’une variable catégorielle (couleur, sexe, jours de la semaine, religion, …)

Pour créer un facteur, on utilise la fonction factor(). Typiquement, on commence par définir un vecteur classique (caractère, numérique ou logique) et puis on le transforme en facteur.

fh <- c("H", "F", "F", "F", "F", "H", "F", "H", "H", "F", "F", "F")
sexe <- factor(fh)
sexe
 [1] H F F F F H F H H F F F
Levels: F H

Un facteur inclue non seulement les valeurs de la variable catégorique correspondante mais aussi les différents niveaux possibles de cette variable (même éventuellement ceux qui ne sont pas représentés dans les données).

Beaucoup de fonctions en R réservent un traitement spécial pour les facteurs, c’est pourquoi il est important de bien définir un facteur comme tel pour qu’il soit correctement traité par R. Voici un exemple.

plot(fh)
Error in plot.window(...) ....
plot(sexe)

En interne, R encode les valeurs d’un facteur sous forme d’entiers: 1 pour le premier niveau, 2 pour le le deuxième niveau, et ainsi de suite. Pour voir cela, examinons la structure de l’objet sexe.

str(sexe)
 Factor w/ 2 levels "F","H": 2 1 1 1 1 2 1 2 2 1 ...

Cette sortie indique que sexe est bel et bien un facteur avec deux modalités “F” ou “H”, encodées comme 1 et 2, respectivement.

L’argument levels

L’argument optionnel levels de la fonction factor() spécifie quels sont les niveaux possibles du facteur et quel sera l’ordre d’affichage de ces derniers. Par défaut les niveaux possibles d’un facteur sont les valeurs uniques du vecteur utilisé pour le créer et, toujours par defaut, les niveaux d’un facteur sont affichés par ordre alphanumérique croissant. À ce propos, dans les sorties ci-dessus, on vient bien que “F” apparaît toujours avant “H” . On peut changer cela facilement en changeant l’ordre des niveaux comme ceci:

sexe <- factor(sexe, levels = c("H", "F"))
sexe
 [1] H F F F F H F H H F F F
Levels: H F
plot(sexe)

Dans l’exemple suivant, de représente le résultat du lancement d’un dé dix fois.

de <- factor(c(3, 2, 2, 1, 3, 1, 3, 1, 6, 6))
de
 [1] 3 2 2 1 3 1 3 1 6 6
Levels: 1 2 3 6

Si on exécute le code suivant, on obtient un Warning et une valeur manquante dans de.

de[11] <- 5
Warning in `[<-.factor`(`*tmp*`, 11, value = 5): invalid factor level, NA
generated
de
 [1] 3    2    2    1    3    1    3    1    6    6    <NA>
Levels: 1 2 3 6

Cela est normal puisque 5 ne fait pas partie de la liste des modalités de l’objet de. Pour corriger cela, il suffit de donner la liste complète des modalités lorsqu’on crée le facteur.

de <- factor(c(3, 2, 2, 1, 3, 1, 3, 1, 6, 6), levels = 1:6)
de
 [1] 3 2 2 1 3 1 3 1 6 6
Levels: 1 2 3 4 5 6
de[11] <- 5
de
 [1] 3 2 2 1 3 1 3 1 6 6 5
Levels: 1 2 3 4 5 6

La fonction levels()

La fonction levels() sert à extraire les niveaux possibles d’un facteur:

levels(sexe)
[1] "H" "F"
levels(de)
[1] "1" "2" "3" "4" "5" "6"

Cette fonction peut aussi être utilisée pour modifier, ajouter, ou supprimer des niveaux. Voici quelques exemples.

  • Renommer un niveau:
levels(sexe)[1] <- "mâle"
sexe
 [1] mâle F    F    F    F    mâle F    mâle mâle F    F    F   
Levels: mâle F
  • Renommer tous les niveaux:
levels(sexe) <- c("Homme", "Femme")
sexe
 [1] Homme Femme Femme Femme Femme Homme Femme Homme Homme Femme Femme Femme
Levels: Homme Femme

Il faut faire attention à l’ordre lorsqu’on utilise la fonction levels(). Dans l’exemple ci-dessus, l’expression levels(sexe) <- c("Homme", "Femme") signifie que l’on demande à R de remplacer le premier niveau de sexe par “Homme” et le deuxième par “Femme”; càd “mâle” devient “Homme” et “F” devint “Femme”. Si à la place on fait levels(sexe) <- c( "Femme", "Homme") alors on inverserait les sexes.

  • Ajouter des niveaux à un facteur existant:
levels(sexe) <- c(levels(sexe), "Mâle", "femelle", "fille", "garçon")
sexe
 [1] Homme Femme Femme Femme Femme Homme Femme Homme Homme Femme Femme Femme
Levels: Homme Femme Mâle femelle fille garçon
  • Supprimer/regrouper des niveaux:
levels(sexe) <- c("Homme", "Femme", "Homme", "Femme", "Femme", "Homme")
sexe
 [1] Homme Femme Femme Femme Femme Homme Femme Homme Homme Femme Femme Femme
Levels: Homme Femme