34 votes

Pourquoi la terminologie des étiquettes et des niveaux des facteurs est-elle si étrange?

Un exemple de non-réglable fonction serait labels. Vous pouvez uniquement définir le facteur d'étiquettes lorsqu'ils sont créés avec la fonction de facteur. Il n'y a pas d' labels<- fonction. Pas que les "étiquettes" et de "niveaux" dans les facteurs de sens....

>  fac <- factor(1:3, labels=c("one", "two", "three"))
> fac
[1] one   two   three
Levels: one two three
> labels(fac)
[1] "1" "2" "3"

OK, j'ai demandé pour les étiquettes, que l'on pourrait supposer étaient fixés par le facteur d'appeler, mais je reçois quelque chose d'assez ... quel est le mot, pas intuitif?

> levels(fac)
[1] "one"   "two"   "three"

Il semble donc que les étiquettes est vraiment réglage des niveaux.

>  fac <- factor(1:3, levels=c("one", "two", "three"))
> levels(fac)
[1] "one"   "two"   "three"

OK c'est comme prévu. Quels sont donc les étiquettes lorsque l'un des ensembles de niveaux?

>  fac <- factor(1:3, levels=c("one", "two", "three"), labels=c("x","y", "z") )
> labels(fac)
[1] "1" "2" "3"
> levels(fac)
[1] "x" "y" "z"

Effing bizarre, si vous me demandez. Il semblerait que les "étiquettes" des arguments pour le facteur trump toutes les "niveaux" des arguments pour la spécification des niveaux. Pourquoi cela devrait-il être? Semble comme une confusion de la terminologie. Et pourquoi est - labels() retour ce que j'aurais imaginé être récupéré avec comme.personnage(comme.numérique(fac))?

(C'était un tangentielle commentaire [étiquette] dans une précédente réponse à propos de l'affectation de fonctions à laquelle j'ai été invité à se déplacer à une question. Alors, voici votre chance de m'éclairer.)

29voto

Ben Bolker Points 50041

Je pense que la façon de penser à propos de la différence entre labels et levels (en ignorant l' labels() fonction que Tommy décrit dans sa réponse) c'est qu' levels est destiné à dire R les valeurs à rechercher dans l'entrée (x) et ce afin de les utiliser dans les niveaux de l'résultant factor objet, et labels est de changer les valeurs des niveaux après l'entrée a été codé comme un facteur de ... comme suggéré par Tommy réponse, il n'y a aucune partie de l' factor objet renvoyé en factor() qui est appelé labels ... juste les niveaux, qui ont été ajustés par l' labels de l'argumentation ... (clair comme de la boue).

Par exemple:

> f <- factor(x=c("a","b","c"),levels=c("c","d","e"))
> f
[1] <NA> <NA> c  
Levels: c d e
> str(f)
Factor w/ 3 levels "c","d","e": NA NA 1

Parce que les deux premiers éléments de la x n'ont pas été trouvés en levels, les deux premiers éléments de la f sont NA. Parce qu' "d" et "e" ont été inclus dans levels, ils apparaissent dans les niveaux de l' f , bien qu'elles ne se produisent pas en x.

Maintenant, avec labels:

> f <- factor(c("a","b","c"),levels=c("c","d","e"),labels=c("C","D","E"))
> f
[1] <NA> <NA> C   
Levels: C D E

Après la R des chiffres sur ce qui devrait être dans le facteur, il re-codes les niveaux. On peut bien sûr l'utiliser pour faire cérébro-des choses telles que:

> f <- factor(c("a","b","c"),levels=c("c","d","e"),labels=c("a","b","c"))
> f
[1] <NA> <NA> a   
Levels: a b c

Une autre manière de penser l' levels que factor(x,levels=L1,labels=L2) est équivalent à

f <- factor(x,levels=L1)
levels(f) <- L2

Je pense en conséquence le libellé de la version de cet exemple pourrait être sympa pour Pat Burns, le R inferno -- il y a beaucoup de facteur de casse-tête dans la section 8.2, mais pas celui-ci en particulier ...

17voto

Tommy Points 16323

L' labels fonction sonne comme la solution idéale pour obtenir les étiquettes d'un facteur.

...mais l' labels fonction n'a rien à voir avec les facteurs de! Il est utilisé comme générique de façon à obtenir quelque chose de "label", un objet. Pour l'vecteurs, ce serait les noms. Mais si il n'y a pas de noms, l' labels fonction retourne l'indice de l'élément contraints à faire des cordes, quelque chose comme as.character(seq_along(x)).

...C'est ce que vous voyez lorsque vous essayez d'étiquettes sur un facteur. Le facteur est un nombre entier de vecteur sans noms, mais avec un levels d'attribut.

Un facteur n'a pas d'étiquettes. Il n'a de niveaux. L' labels argument factor est juste une façon d'être en mesure de donner un ensemble de chaînes de caractères, mais de produire un autre ensemble de chaînes que les niveaux... Mais pour embrouiller encore plus les choses, l' dput fonction imprime l' levels attributs .Label! Je pense que c'est un héritage chose...

# Translate lower case letters to upper case.
f <- factor(letters[2:4], letters[1:3], LETTERS[1:3])
dput(f)
#structure(c(2L, 3L, NA), .Label = c("A", "B", "C"), class = "factor")
attributes(f)
#$levels
#[1] "A" "B" "C"
#
#$class
#[1] "factor"

Cependant, depuis labels est une fonction générique, il serait probablement une bonne idée de définir labels.factor comme suit (il n'existe actuellement aucun). Peut-être quelque chose pour les R de base à prendre en considération?

labels.factor <- function(x, ...) as.character(x)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X