Eliminer les modalités d'un facteur qui n’existent plus

Auteur.e.s
Fabrice Dessaint, Inra
Résumé

Lorsque l’on sélectionne une partie d’un jeu de données, il peut arriver que certaines des modalités des variables qualitatives de type factor n’existent plus. Le souci, c’est que R semble ignorer cette nouvelle situation.

Exemples

Soit l’exemple suivant:

lettres <- factor(LETTERS[1:10])
lettres
##  [1] A B C D E F G H I J
## Levels: A B C D E F G H I J

Le vecteur lettres est de type factor et il a 10 modalités. Si on sélectionne certain des éléments dans ce vecteur,

abcd <- lettres[seq(1, 10, 2)]
abcd
## [1] A C E G I
## Levels: A B C D E F G H I J

on obtient bien un vecteur plus petit (ici 5) mais avec le même nombre de niveaux que le vecteur d’origine (10). On a donc un certain nombre de modalités qui ne sont plus représentées mais que R a conservé:

table(abcd)
## abcd
## A B C D E F G H I J 
## 1 0 1 0 1 0 1 0 1 0

Plusieurs fonctions sont disponibles pour résoudre ce problème. Nous en présentons 2.

La fonction factor()

Pour le traitement d’une seule variable, on peut utiliser la fonction factor().

abcd
## [1] A C E G I
## Levels: A B C D E F G H I J
abcd <- factor(abcd)
abcd
## [1] A C E G I
## Levels: A C E G I

La fonction droplevels()

Pour une variable ou l’ensemble des variables de type factor d’un data.frame, on pourra utiliser la fonction droplevels(). Pour une variable

abcd <- lettres[seq(1, 10, 2)]
abcd
## [1] A C E G I
## Levels: A B C D E F G H I J
abcd <- droplevels(abcd)
abcd
## [1] A C E G I
## Levels: A C E G I

Pour un data.frame

abcd <- lettres[seq(1, 10, 2)]
ABCD <- lettres[seq(0, 10, 2)]
df <- data.frame(abcd = abcd, Nb = 1:5, ABCD = ABCD)
str(df)
## 'data.frame':    5 obs. of  3 variables:
##  $ abcd: Factor w/ 10 levels "A","B","C","D",..: 1 3 5 7 9
##  $ Nb  : int  1 2 3 4 5
##  $ ABCD: Factor w/ 10 levels "A","B","C","D",..: 2 4 6 8 10

On peut traiter l’ensemble des variables ou seulement une partie avec l’argument except=

df <- droplevels(df, except = "ABCD")
str(df)
## 'data.frame':    5 obs. of  3 variables:
##  $ abcd: Factor w/ 5 levels "A","C","E","G",..: 1 2 3 4 5
##  $ Nb  : int  1 2 3 4 5
##  $ ABCD: Factor w/ 10 levels "A","B","C","D",..: 2 4 6 8 10

Autre façon d’éliminer les modalités inexistantes de la variable ABCD :

df$ABCD
## [1] B D F H J
## Levels: A B C D E F G H I J
df$ABCD <- df$ABCD[, drop = TRUE]
df$ABCD
## [1] B D F H J
## Levels: B D F H J
Versions des outils utilisés
R version 3.4.2 (2017-09-28)
Thèmes de la fiche
Thèmes