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, modalités ou valeurs possibles). En pratique, un facteur est typiquement utilisé pour stocker les valeurs observées d’une variable catégorielle, càd une variable avec un nombre fixé et limité de valeurs possibles (couleur, sexe, jours de la semaine, religion, …).
La création d’un facteur se fait à l’aide de la fonction factor(). En général, on part d’un vecteur (numérique ou de chaînes de caractères), que l’on convertit par la suite en facteur.
[1] H F F F F H F H H F F F
Levels: F H
Un facteur enregistre les valeurs observées d’une variable, mais aussi toutes ses modalités possibles. Par défaut, ces modalités sont déterminées automatiquement à partir des valeurs uniques du vecteur. Par exemple, le facteur sexe défini ci-dessus ne peut prendre que les valeurs “H” ou “F”. Ainsi, si l’on exécute le code suivant, on obtient un avertissement (Warning) et une valeur manquante (NA) dans sexe :
Warning in `[<-.factor`(`*tmp*`, 13, value = "Homme"): invalid factor level, NA
generated
[1] H F F F F H F H H F F F <NA>
Levels: F H
Cela est normal, puisque “Homme” ne fait pas partie de la liste des valeurs possibles de l’objet sexe. Pour éviter ce type de problème, il est possible de définir explicitement les modalités d’un facteur lors de sa création. Nous verrons comment faire cela par la suite.
Avant d’aborder ce point, notez que de nombreuses fonctions en R traitent les facteurs de manière spécifique. C’est pourquoi il est important de bien définir une variable comme facteur, afin qu’elle soit correctement interprétée par R. Voici un exemple illustrant ce comportement.
Error in plot.window(...) ....
Notez aussi que, 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.
[1] "integer"
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” et “H”, encodées comme 1 et 2, respectivement. Les premiers éléments de sexe sont : 2 1 1 …, càd “H” “F” “F” ….
L’argument levels
On a vu que les niveaux d’un facteur sont déterminés automatiquement à partir des valeurs uniques du vecteur utilisé pour le créer. De plus, ces niveaux sont affichés selon l’ordre alphanumérique croissant. Par exemple, dans les sorties précédentes, on remarque que “F” apparaît toujours avant “H”, ce qui reflète cet ordre par défaut.
L’argument optionnel levels de la fonction factor() permet de préciser explicitement les modalités possibles d’un facteur, ainsi que l’ordre dans lequel ces niveaux seront affichés.
[1] H F F F F H F H H F F F
Levels: H F
Pour mieux comprendre l’importance de l’argument levels, imaginons que l’on souhaite analyser les résultats d’une expérience simple : lancer un dé à six faces dix fois, et enregistrer les valeurs obtenues. Pour cela, on stocke les résultats dans un vecteur, puis on les convertit en facteur afin de les traiter comme une variable catégorique.
[1] 3 2 2 1 3 1 3 1 6 6
Levels: 1 2 3 4 5 6
En utilisant l’argument levels = 1:6, on indique explicitement que le facteur de peut prendre toutes les valeurs de 1 à 6, même si certaines (comme 4 et 5) ne sont pas présentes dans notre échantillon. Cette précision est utile, par exemple, lorsqu’on veut afficher ou analyser la fréquence de chaque face du dé.
de
1 2 3 4 5 6
3 2 3 0 0 2
Grâce à l’argument levels, le code suivant ne génère aucun Warning lorsque l’on ajoute, par exemple, la valeur 5 :
[1] 3 2 2 1 3 1 3 1 6 6 5
Levels: 1 2 3 4 5 6
Cela fonctionne car 5 fait partie des niveaux explicitement définis lors de la création du facteur (levels = 1:6).
La fonction levels()
Une fois le facteur créé, la fonction levels() permet d’accéder ou de modifier les niveaux d’un facteur existant, comme illustré dans les exemples suivants.
- Afficher les niveaux:
[1] "H" "F"
[1] "1" "2" "3" "4" "5" "6"
- Modifier un ou plusieurs niveau(x):
[1] male F F F F male F male male F F F
Levels: male F
[1] 3 Face2 Face2 1 3 1 3 1 6 6 Face5
Levels: 1 Face2 3 4 Face5 6
[1] Face3 Face2 Face2 Face1 Face3 Face1 Face3 Face1 Face6 Face6 Face5
Levels: Face1 Face2 Face3 Face4 Face5 Face6
[1] Homme Femme Femme Femme Femme Homme Femme Homme Homme Femme Femme Femme
Levels: Femme Homme
Cette dernier méthode — càd l’utilisation d’une liste de correspondance entre les nouveaux et les anciens niveaux — est préférable lorsqu’il s’agit de modifier plusieurs niveaux à la fois, car elle réduit les risques d’erreurs liés à l’ordre des niveaux. Par exemple, écrire levels(sexe) <- c("Femme", "Homme"), au lieu de levels(sexe) <- c("Homme", "Femme"), inverse les sexes, ce qui peut entraîner une interprétation erronée des données.
- Ajouter des niveaux à un facteur existant:
[1] Homme Femme Femme Femme Femme Homme Femme Homme Homme Femme Femme Femme
Levels: Femme Homme Male femelle fille garcon H F
- Supprimer/regrouper des niveaux:
levels(sexe) <- list("Homme" = c("Homme", "Male", "garcon", "H"), "Femme" = c("Femme", "femelle", "fille", "F"))
sexe [1] Homme Femme Femme Femme Femme Homme Femme Homme Homme Femme Femme Femme
Levels: Homme Femme