Les facteurs sous R
Ce que vous devez connaitre sur ce type de vecteur particulier
Les facteurs (ou factor) sous R sont un peu déroutants pour celui qui débute dans la mesure ou il s'agit d'une dénomination propre à R. Néanmoins la structure sous-jacente est assez simple à comprendre. Voyons tout cela.
Un facteur est un vecteur
Le type d'objet vecteur est essentiel sous R. Il s'agit d'une structure de données qui véhicule l'essentiel
des informations et la plupart des fonctions statistiques sont basées dessus.
Pour rappel, un vecteur sous R est défini par le type de données qui le composent (il ne peut y en avoir qu'un seul),
sa taille et ses attributs.
Un facteur est un vecteur réservé aux variables catégorielles dont les modalités sont connues. La principale différence avec un vecteur chaine classique réside dans le fait que les modalités qui le composent sont référencées. Ainsi aucune observation ne pourra être ajoutée au facteur si celle-ci se rapporte à une modalité non prédéfinie.
Prenons un exemple tres simple :
groupe <- c('O', 'A' ,'B', 'O', 'AB', 'B', 'O', 'A')
groupe <- factor(groupe)
groupe
> groupe [1] O A B O AB B O A Levels: A AB B O
Nous avons ci-dessus déclaré puis initialisé un nouveau vecteur chaine contenant les groupes sanguins de 8 individus. Nous avons ensuite converti ce vecteur en facteur via la fonction factor(). En faisant cela, R a stocké dans un attribut "levels" du facteur les valeurs distinctes que la variable groupe peut prendre, c'est à dire ses modalités.
Affichons à présent la structure de l'objet R associé au facteur groupe que nous venons de créer :
str(groupe)
> str(groupe) Factor w/ 4 levels "A","AB","B","O": 4 1 3 4 2 3 4 1
Nous constatons que l'objet groupe est bien un facteur, que celui-ci a 4 niveaux correspondant aux quatre modalités de groupe sanguin que contient notre jeu de données. Par ailleurs, chose intéressante, les valeurs du vecteur sous-jacent sont constituées des indices de chacune des modalités et non des modalités elles-mêmes.
Ordre des niveaux
Les niveaux d'un facteur, nous l'avons vu, correspondent aux modalités de la variable catégorielle. Par défaut, lors de la
création ou du recodage d'une variable en facteur, les niveaux sont ordonnés par ordre alphanumérique croissant.
L'ordre des niveaux va déterminer leur affichage sur les graphiques notamment.
Dressons rapidement un diagramme des effectifs de chacun des groupes :
plot(groupe)

Nous constatons que les barres suivent l'ordre du référencement des niveaux. Réordonnons à présent les niveaux de notre facteur groupe afin de placer le groupe O en premier et affichons de nouveau notre diagramme :
groupe <- factor(groupe, levels = c("O","AB","B","A"))
plot(groupe)

Comme attendu, le groupe sanguin est venu se placer en tête.
Gestion des données
Comme nous l'avons évoqué, toute modification ou ajout d'observations dans le facteur doit se rapporter à une
modalité référencée. Procédons, pour l'exemple, à la modification du premier individu.
Nous allons modifier le groupe sanguin de l'individu d'indice 1 afin de passer son groupe de O à A.
groupe <- c('O', 'A' ,'B', 'O', 'AB', 'B', 'O', 'A')
groupe <- factor(groupe)
print('facteur original')
str(groupe)
groupe[1] <- 'A'
print('facteur mis a jour')
str(groupe)
[1] "facteur original" Factor w/ 4 levels "A","AB","B","O": 4 1 3 4 2 3 4 1 ^ [1] "facteur mis a jour" Factor w/ 4 levels "A","AB","B","O": 1 1 3 4 2 3 4 1 ^
Vous constatez que l'indice du premier élément du facteur est passé de 4 (modalité O) à 1 (modalité A). Procédons de même avec une modalité inexistante, C par exemple :
groupe[1] <- 'C'
print('facteur mis a jour')
str(groupe)
[4] AVIS: Warning in `[<-.factor`(`*tmp*`, 1, value = "C") : niveau de facteur incorrect, NAs generes [1] "facteur mis a jour" Factor w/ 4 levels "A","AB","B","O": NA 1 3 4 2 3 4 1 ^
Comme nous pouvions nous y attendre, un avertissement nous est adressé par R afin de nous prévenir que le groupe C est inconnu. Cependant ce n'est pas bloquant, vous constatez que R a positionné une valeur manquante NA en lieu et place du premier indice.
Pour réaliser l'opération précédente, il est possible de procéder à un recodage temporaire du facteur en vecteur caractère, puis de modifier l'observation avant de reconvertir en facteur. Voici ce que cela donne :
groupe <- as.character(groupe)
groupe[1] = 'C'
groupe <- factor(groupe)
print('facteur mis a jour')
str(groupe)
[1] "facteur mis a jour" Factor w/ 5 levels "A","AB","B","C","O": 4 1 3 5 2 3 5 1
Notre facteur compte désormais 5 niveaux. Le groupe C étant venu s'intercaler entre B et O, vous noterez que les indices des individus de groupe O sont passés de 4 à 5, ce qui peut poser un problème éventuel de compatibilité du code.
L'opération que nous venons de réaliser peut s'effectuer autrement en procédant tout d'abord à l'ajout d'un niveau, puis ensuite à la modification de l'observation. Nous allons voir ceci grâce à la fonction level()
Gestion des niveaux avec levels()
Il est possible d'accéder simplement aux niveaux d'un facteur via la fonction levels().
levels(groupe)
> levels(groupe) [1] "A" "AB" "B" "C" "O"
De même, levels() va nous permettre de modifier une modalité, voir toutes les modalités.
levels(groupe)[1] <- 'gA'
str(groupe)
Factor w/ 5 levels "gA","AB","B","C","O": 4 1 3 5 2 3 5 1
levels(groupe) <- c('gA', 'gAB', 'gB', 'gC', 'gO')
str(groupe)
Factor w/ 5 levels "gA","gAB","gB","gC","gO": 4 1 3 5 2 3 5 1
Nous allons revenir à présent sur notre facteur original puis ajouter un niveau C avant d'ajouter une observation.
groupe <- c('O', 'A' ,'B', 'O', 'AB', 'B', 'O', 'A')
groupe <- factor(groupe)
print('facteur original')
str(groupe)
levels(groupe) <- c(levels(groupe), "A", "AB", "B", "C", "O")
print('ajout niveau C')
str(groupe)
print('facteur mis a jour')
groupe[1] <- 'C'
str(groupe)
[1] "facteur original" Factor w/ 4 levels "A","AB","B","O": 4 1 3 4 2 3 4 1 [1] "ajout niveau C" Factor w/ 5 levels "A","AB","B","O","C": 4 1 3 4 2 3 4 1 [1] "facteur mis a jour" Factor w/ 5 levels "A","AB","B","O","C": 5 1 3 4 2 3 4 1
Sur le même principe, nous pouvons renommer ou supprimer des niveaux.
Retrouvez dans la rubrique "Nos datasets" toutes les données dont vous aurez besoin pour tester et pratiquer !