Dans R, nous avons un objet spécial appelé factor. De manière simple, nous pouvons dire que factor est une variable catégorique et qu’il est très important pour la modélisation statistique (plus d’informations sur cet objet: page d’aide dans R ?factor
, ou bien vous trouverez un bon résume ici).
C’est un moyen très efficace de stocker des caractères lorsqu’il y a des valeurs répétées car il stocke les étiquettes et les encode numériquement.
Regardons deux exemples simples de factor :
en utilisant des caractères, nous avons :
> z=factor(c("v","d","v","e","v","d","e","d","v","e"))
> z
[1] v d v e v d e d v e
Levels: d e v
> str(z)
Factor w/ 3 levels "d","e","v": 3 1 3 2 3 1 2 1 3 2
> table(z)
z
d e v
3 3 4
et en utilisant des valeurs numériques, nous avons :
> set.seed(1)
> x=factor(sample(c(6000:6003),10,replace = T))
> x
[1] 6000 6003 6002 6000 6001 6000 6002 6002 6001 6001
Levels: 6000 6001 6002 6003
> str(x)
Factor w/ 4 levels "6000","6001",..: 1 4 3 1 2 1 3 3 2 2
> table(x)
x
6000 6001 6002 6003
3 3 3 1
Comme vous pouvez le voir si vous appelez le factor directement, vous obtiendrez les niveaux en sortie, mais lorsque nous utilisons la fonction str() (pour inspecter la structure d’un objet), cela montre que R utilise, en interne, des entiers pour représenter les différents niveaux :
> str(z)
Factor w/ 3 levels "d","e","v": 3 1 3 2 3 1 2 1 3 2
> str(x)
Factor w/ 4 levels "6000","6001",..: 1 4 3 1 2 1 3 3 2 2
Dans le cas de z d = 1, e = 2 et v = 3; et pour x 6000 = 1, 6001 = 2, 6002 = 3 et 6003 = 4.
Parfois, il peut-être intéressant de faire des opérations sur les valeurs d’un factor. Par exemple, supposons que nous voulons obtenir la moyenne de x.
> (6000 + 6003 + 6002 + 6000 + 6001 + 6000 + 6002 + 6002 + 6001 + 6001)/10
[1] 6001.2
Nous pouvons essayer d’utiliser mean() avec x comme facteur :
> mean(x)
[1] NA
Warning message:
In mean.default(x) : argument is not numeric or logical: returning NA
Le problème est que nous avons besoin d’objets numeric (ou logical) pour obtenir la moyenne. Nous pouvons essayer d’utiliser as.numeric() :
> mean(as.numeric(x))
[1] 2.2
Mais R prend le codage interne pour transformer la variable en numeric et nous obtenons un résultat incorrect. Il existe 2 façons (pour autant que je sache) de résoudre le problème. La première consiste à transformer factor en character avant de le transformer en une variable numeric:
> mean(as.numeric(as.character(x)))
[1] 6001.2
et la seconde, légèrement plus efficace, utilise la fonction levels() :
> mean(as.numeric(levels(x)[x]))
[1] 6001.2