Traiter les facteurs dans R est un travail assez particulier, je dois admettre ... Tout en réorganisant les niveaux de facteur, vous ne réorganisez pas les valeurs numériques sous-jacentes. Voici une petite démonstration:
> numbers = 1:4
> letters = factor(letters[1:4])
> dtf <- data.frame(numbers, letters)
> dtf
numbers letters
1 1 a
2 2 b
3 3 c
4 4 d
> sapply(dtf, class)
numbers letters
"integer" "factor"
Maintenant, si vous convertissez ce facteur en numérique, vous obtiendrez:
# return underlying numerical values
1> with(dtf, as.numeric(letters))
[1] 1 2 3 4
# change levels
1> levels(dtf$letters) <- letters[4:1]
1> dtf
numbers letters
1 1 d
2 2 c
3 3 b
4 4 a
# return numerical values once again
1> with(dtf, as.numeric(letters))
[1] 1 2 3 4
Comme vous pouvez le voir ... en changeant de niveau, vous ne changez que les niveaux (qui le dirait, hein?), Pas les valeurs numériques! Mais, lorsque vous utilisez la factor
fonction comme @Jonathan Chang l'a suggéré, quelque chose de différent se produit: vous changez les valeurs numériques elles-mêmes.
Vous obtenez une fois de plus une erreur parce que vous le faites levels
et essayez ensuite de la revaloriser factor
. Ne fais pas ça !!! Ne pas utiliserlevels
ou vous allez tout gâcher (sauf si vous savez exactement ce que vous faites).
Une petite suggestion: évitez de nommer vos objets avec un nom identique aux objets de R ( df
est la fonction de densité pour la distribution F, letters
donne des lettres minuscules de l'alphabet). Dans ce cas particulier, votre code ne serait pas défectueux, mais parfois il peut l'être ... mais cela peut créer de la confusion, et nous ne voulons pas de cela, n'est-ce pas?!? =)
Au lieu de cela, utilisez quelque chose comme ça (je vais recommencer depuis le début):
> dtf <- data.frame(f = 1:4, g = factor(letters[1:4]))
> dtf
f g
1 1 a
2 2 b
3 3 c
4 4 d
> with(dtf, as.numeric(g))
[1] 1 2 3 4
> dtf$g <- factor(dtf$g, levels = letters[4:1])
> dtf
f g
1 1 a
2 2 b
3 3 c
4 4 d
> with(dtf, as.numeric(g))
[1] 4 3 2 1
Notez que vous pouvez également vous nommer data.frame
avec df
et letters
au lieu de g
, et le résultat sera OK. En fait, ce code est identique à celui que vous avez posté, seuls les noms sont modifiés. Cette partiefactor(dtf$letter, levels = letters[4:1])
ne ferait pas d'erreur, mais elle peut être déroutante!
Lisez ?factor
attentivement le manuel! Quelle est la différence entre factor(g, levels = letters[4:1])
et factor(g, labels = letters[4:1])
? Qu'est-ce qui est similaire dans levels(g) <- letters[4:1]
et g <- factor(g, labels = letters[4:1])
?
Vous pouvez mettre la syntaxe ggplot, afin que nous puissions vous aider davantage sur celui-ci!
À votre santé!!!
Éditer:
ggplot2
nécessite réellement de changer les niveaux et les valeurs? Hm ... je vais creuser celui-ci ...