Tratar con factores en R es un trabajo bastante peculiar, debo admitir ... Al reordenar los niveles de factores, no reordenas los valores numéricos subyacentes. Aquí hay una pequeña demostración:
> 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"
Ahora, si convierte este factor a numérico, obtendrá:
# 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
Como puede ver ... al cambiar los niveles, solo cambia los niveles (¿quién lo diría, eh?), ¡No los valores numéricos! Pero, cuando usa la factorfunción como sugirió @Jonathan Chang, sucede algo diferente: usted mismo cambia los valores numéricos.
levelsRecibes un error una vez más porque lo haces y luego intentas volver a nivelarlo factor. No lo hagas !!! No lo use levelso arruinará las cosas (a menos que sepa exactamente lo que está haciendo).
Una pequeña sugerencia: evite nombrar sus objetos con un nombre idéntico al de los objetos de R ( dfes la función de densidad para la distribución de F, lettersda letras minúsculas del alfabeto). En este caso en particular, su código no sería defectuoso, pero a veces puede ser ... pero esto puede crear confusión, y no queremos eso, ¿verdad? =)
En su lugar, use algo como esto (volveré desde el principio una vez más):
> 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
Tenga en cuenta que también puede nombrarlo data.framecon dfy en letterslugar de g, y el resultado estará bien. En realidad, este código es idéntico al publicado, solo se cambian los nombres. ¡Esta parte factor(dtf$letter, levels = letters[4:1])no arrojaría un error, pero puede ser confuso!
¡Lea el ?factormanual a fondo! ¿Cuál es la diferencia entre factor(g, levels = letters[4:1])y factor(g, labels = letters[4:1])? ¿Qué es similar en levels(g) <- letters[4:1]y g <- factor(g, labels = letters[4:1])?
¡Puedes poner la sintaxis de ggplot, para que podamos ayudarte más en este!
¡¡¡Salud!!!
Editar:
ggplot2en realidad requiere cambiar tanto los niveles como los valores? Hm ... voy a cavar este ...