R LanguageFacteurs


Syntaxe

  1. facteur (x = caractère (), niveaux, libellés = niveaux, exclure = NA, ordonné = est.ordonné (x), nmax = NA)
  2. Exécuter ?factor ou voir la documentation en ligne.

Remarques

Un objet avec factor classe est un vecteur avec un ensemble particulier de caractéristiques.

  1. Il est stocké en interne sous forme de vecteur integer .
  2. Il conserve un attribut de levels qui indique la représentation des valeurs par les caractères.
  3. Sa classe est stockée comme factor

Pour illustrer, générons un vecteur de 1 000 observations à partir d’un ensemble de couleurs.

set.seed(1)
Color <- sample(x = c("Red", "Blue", "Green", "Yellow"), 
                size = 1000, 
                replace = TRUE)
Color <- factor(Color)

Nous pouvons observer chacune des caractéristiques de la Color énumérées ci-dessus:

#* 1. It is stored internally as an `integer` vector
typeof(Color)
[1] "integer"
#* 2. It maintains a `levels` attribute the shows the character representation of the values.
#* 3. Its class is stored as `factor`
attributes(Color)
$levels
[1] "Blue"   "Green"  "Red"    "Yellow"

$class
[1] "factor"

Le principal avantage d'un objet factor est l'efficacité du stockage des données. Un entier nécessite moins de mémoire à stocker qu'un caractère. Une telle efficacité était hautement souhaitable lorsque de nombreux ordinateurs avaient des ressources beaucoup plus limitées que les machines actuelles (pour un historique plus détaillé des motivations derrière l'utilisation de facteurs, voir stringsAsFactors : une biographie non autorisée ). La différence d'utilisation de la mémoire peut être vue même dans notre objet Color . Comme vous pouvez le voir, stocker la Color tant que caractère nécessite environ 1,7 fois plus de mémoire que l’objet factor.

#* Amount of memory required to store Color as a factor.
object.size(Color)
4624 bytes
#* Amount of memory required to store Color as a character
object.size(as.character(Color))
8232 bytes

Mapper l'entier au niveau

Alors que le calcul interne des facteurs considère l'objet comme un entier, la représentation souhaitée pour la consommation humaine est le niveau de caractère. Par exemple,

head(Color)
[1] Blue   Blue   Green  Yellow Red    Yellow  
Levels: Blue Green Red Yellow

est plus facile pour la compréhension humaine que

head(as.numeric(Color))
[1] 1 1 2 4 3 4

Une illustration approximative de la manière dont R correspond à la représentation des caractères à la valeur entière interne est:

head(levels(Color)[as.numeric(Color)])
[1] "Blue"   "Blue"   "Green"  "Yellow" "Red"    "Yellow"

Comparez ces résultats à

head(Color)
[1] Blue   Blue   Green  Yellow Red    Yellow  
Levels: Blue Green Red Yellow

Utilisation moderne des facteurs

En 2007, R a introduit une méthode de hachage des caractères pour réduire la charge de mémoire des vecteurs de caractères (réf: stringsAsFactors : une biographie non autorisée ). Notez que lorsque nous avons déterminé que les caractères nécessitaient 1,7 fois plus d'espace de stockage que les facteurs, cela a été calculé dans une version récente de R, ce qui signifie que l'utilisation de mémoire des vecteurs de caractères était encore plus lourde avant 2007.

En raison de la méthode de hachage dans le R moderne et de ressources de mémoire beaucoup plus importantes dans les ordinateurs modernes, le problème de l'efficacité de la mémoire dans le stockage des valeurs de caractère a été réduit à un très petit souci. L'attitude qui prévaut dans la communauté R est une préférence pour les vecteurs de caractères par rapport aux facteurs dans la plupart des situations. Les principales causes de l'abandon des facteurs sont

  1. L'augmentation des données de caractères non structurées et / ou faiblement contrôlées
  2. La tendance des facteurs à ne pas se comporter comme souhaité lorsque l'utilisateur oublie qu'il a affaire à un facteur et non à un caractère

Dans le premier cas, il est inutile de stocker du texte libre ou des champs de réponse ouverts en tant que facteurs, car il est peu probable qu'un motif autorise plus d'une observation par niveau. Alternativement, si la structure des données n'est pas soigneusement contrôlée, il est possible d'obtenir plusieurs niveaux correspondant à la même catégorie (tels que "bleu", "bleu" et "BLEU"). Dans de tels cas, beaucoup préfèrent gérer ces écarts en tant que caractères avant de les convertir en facteurs (si la conversion a lieu).

Dans le second cas, si l'utilisateur pense travailler avec un vecteur de caractères, certaines méthodes peuvent ne pas répondre comme prévu. Cette compréhension de base peut entraîner de la confusion et de la frustration en essayant de déboguer des scripts et des codes. Bien que, à proprement parler, cela puisse être considéré comme la faute de l'utilisateur, la plupart des utilisateurs sont heureux d'éviter d'utiliser des facteurs et d'éviter complètement ces situations.

Facteurs Exemples Liés