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.
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
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"
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.