Confusion entre les niveaux de facteur et les étiquettes de facteur

Il semble y avoir une différence entre les niveaux et les étiquettes d’un facteur dans R. Jusqu’à présent, j’ai toujours pensé que les niveaux étaient le nom «réel» des niveaux de facteurs et que les étiquettes étaient les noms utilisés pour les résultats . Evidemment, ce n’est pas le cas, comme le montre l’exemple suivant:

df <- data.frame(v=c(1,2,3),f=c('a','b','c')) str(df) 'data.frame': 3 obs. of 2 variables: $ v: num 1 2 3 $ f: Factor w/ 3 levels "a","b","c": 1 2 3 df$f <- factor(df$f, levels=c('a','b','c'), labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX')) levels(df$f) [1] "Treatment A: XYZ" "Treatment B: YZX" "Treatment C: ZYX" 

Je pensais que les niveaux (‘a’, ‘b’, ‘c’) pouvaient toujours être accessibles lors de la création de scripts, mais cela ne fonctionne pas:

 > df$f=='a' [1] FALSE FALSE FALSE 

Mais cela fait:

 > df$f=='Treatment A: XYZ' [1] TRUE FALSE FALSE 

Donc, ma question se compose de deux parties:

  • Quelle est la différence entre les niveaux et les étiquettes?

  • Est-il possible d’avoir des noms différents pour les niveaux de facteurs pour les scripts et la sortie?

Contexte: Pour les scripts plus longs, la création de scripts avec des niveaux de facteur courts semble beaucoup plus facile. Toutefois, pour les rapports et les tracés, ces niveaux de facteur courts peuvent ne pas être adéquats et doivent être remplacés par des noms plus précis.

Très court: les niveaux sont les entrées, les étiquettes sont la sortie dans la fonction factor() . Un facteur n’a qu’un atsortingbut level , défini par l’argument labels dans la fonction factor() . Ceci est différent du concept d’étiquettes dans les progiciels statistiques tels que SPSS, et peut être déroutant au début.

Ce que vous faites dans cette ligne de code

 df$f <- factor(df$f, levels=c('a','b','c'), labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX')) 

dit à R qu'il existe un vecteur df$f

  • que vous voulez transformer en facteur,
  • dans lequel les différents niveaux sont codés comme a, b et c
  • et pour lequel vous voulez que les niveaux soient étiquetés comme traitement A etc.

La fonction factor recherche les valeurs a, b et c, les convertit en classes de facteurs numériques et ajoute les valeurs des étiquettes à l'atsortingbut level du facteur. Cet atsortingbut est utilisé pour convertir les valeurs numériques internes en étiquettes correctes. Mais comme vous le voyez, il n'y a pas d'atsortingbut label .

 > df <- data.frame(v=c(1,2,3),f=c('a','b','c')) > atsortingbutes(df$f) $levels [1] "a" "b" "c" $class [1] "factor" > df$f <- factor(df$f, levels=c('a','b','c'), + labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX')) > atsortingbutes(df$f) $levels [1] "Treatment A: XYZ" "Treatment B: YZX" "Treatment C: ZYX" $class [1] "factor" 

J’ai écrit un paquet “lfactors” qui vous permet de faire référence à des niveaux ou des étiquettes.

 # packages install.packages("lfactors") require(lfactors) flips <- lfactor(c(0,1,1,0,0,1), levels=0:1, labels=c("Tails", "Heads")) # Tails can now be referred to as, "Tails" or 0 # These two lines return the same result flips == "Tails" #[1] TRUE FALSE FALSE TRUE TRUE FALSE flips == 0 #[1] TRUE FALSE FALSE TRUE TRUE FALSE 

Notez qu'un facteur nécessite que les niveaux soient numériques afin de ne pas les confondre avec les étiquettes.