Comment réparer dans R : niveau de facteur invalide, NA généré
Un message d’avertissement que vous pouvez rencontrer lors de l’utilisation de R est :
Warning message: In `[<-.factor`(`*tmp*`, iseq, value = "C") : invalid factor level, NA generated
Cet avertissement se produit lorsque vous tentez d’ajouter une valeur à une variable de facteur dans R qui n’existe pas déjà en tant que niveau défini.
L’exemple suivant montre comment répondre à cet avertissement dans la pratique.
Comment reproduire l’avertissement
Supposons que nous ayons le bloc de données suivant dans R :
#create data frame
df <- data.frame(team=factor(c('A', 'A', 'B', 'B', 'B')),
points=c(99, 90, 86, 88, 95))
#view data frame
df
team points
1 A 99
2 A 90
3 B 86
4 B 88
5 B 95
#view structure of data frame
str(df)
'data.frame': 5 obs. of 2 variables:
$ team : Factor w/ 2 levels "A","B": 1 1 2 2 2
$ points: num 99 90 86 88 95
On voit que la variable équipe est un facteur à deux niveaux : « A » et « B »
Supposons maintenant que nous essayions d’ ajouter une nouvelle ligne à la fin du bloc de données en utilisant la valeur « C » pour team :
#add new row to end of data frame
df[nrow(df) + 1,] = c('C', 100)
Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = "C") :
invalid factor level, NA generated
Nous recevons un message d’avertissement car la valeur « C » n’existe pas déjà comme niveau de facteur pour la variable d’équipe .
Il est important de noter qu’il s’agit simplement d’un message d’avertissement et que R ajoutera toujours la nouvelle ligne à la fin du bloc de données, mais il utilisera la valeur NA au lieu de « C » :
#view updated data frame
df
team points
1 A 99
2 A 90
3 B 86
4 B 88
5 B 95
6 NA 100
Comment éviter l’avertissement
Pour éviter l’avertissement de niveau de facteur non valide , nous devons d’abord convertir la variable de facteur en variable de caractère, puis nous pouvons la reconvertir en variable de facteur après avoir ajouté la nouvelle ligne :
#convert team variable to character
df$team <- as.character(df$team)
#add new row to end of data frame
df[nrow(df) + 1,] = c('C', 100)
#convert team variable back to factor
df$team <- as.factor(df$team)
#view updated data frame
df
team points
1 A 99
2 A 90
3 B 86
4 B 88
5 B 95
6 C 100
Notez que nous parvenons à ajouter avec succès une nouvelle ligne à la fin du bloc de données et que nous évitons un message d’avertissement.
On peut également vérifier que la valeur « C » a été ajoutée comme niveau de facteur à la variable équipe :
#view structure of updated data frame
str(df)
'data.frame': 6 obs. of 2 variables:
$ team : Factor w/ 3 levels "A","B","C": 1 1 2 2 2 3
$ points: chr "99" "90" "86" "88" ...
Ressources additionnelles
Les didacticiels suivants expliquent comment corriger d’autres erreurs courantes dans R :
Comment réparer dans R : les arguments impliquent un nombre de lignes différent
Comment réparer dans R : erreur dans la sélection des arguments inutilisés
Comment réparer dans R : le remplacement a une longueur nulle