web-dev-qa-db-fra.com

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

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 vrai nom des niveaux de facteurs et que les étiquettes étaient les noms utilisés pour la sortie (tels que des tableaux et des graphiques). . Évidemment, 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') pourraient toujours être utilisés lors de la création du script, 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 comprend deux parties:

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

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

Arrière-plan: pour les scripts plus longs, les scripts avec des niveaux de facteurs courts semblent beaucoup plus faciles. Cependant, pour les rapports et les graphiques, ces niveaux de facteur courts peuvent ne pas être adéquats et doivent être remplacés par des noms plus précis.

91
donodarazao

Très court: les niveaux sont l'entrée, les étiquettes sont la sortie de la fonction factor(). Un facteur n'a qu'un attribut level, défini par l'argument labels de la fonction factor(). Ce concept est différent du concept d'étiquettes dans des progiciels statistiques tels que SPSS et peut prêter à confusion 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 y a 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 souhaitez que les niveaux soient étiquetés comme traitement A, etc.

La fonction facteur cherchera les valeurs a, b et c, les convertira en classes de facteurs numériques et ajoutera les valeurs d'étiquette à l'attribut level du facteur. Cet attribut est utilisé pour convertir les valeurs numériques internes en étiquettes correctes. Mais comme vous le voyez, il n'y a pas d'attribut label.

> df <- data.frame(v=c(1,2,3),f=c('a','b','c'))    
> attributes(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'))    
> attributes(df$f)
$levels
[1] "Treatment A: XYZ" "Treatment B: YZX" "Treatment C: ZYX"

$class
[1] "factor"
119
Joris Meys

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 exige que les niveaux soient numériques afin qu'ils ne puissent pas être confondus avec les étiquettes.

12
pdb