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 factor
función como sugirió @Jonathan Chang, sucede algo diferente: usted mismo cambia los valores numéricos.
levels
Recibes un error una vez más porque lo haces y luego intentas volver a nivelarlo factor
. No lo hagas !!! No lo use levels
o 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 ( df
es la función de densidad para la distribución de F, letters
da 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.frame
con df
y en letters
lugar 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 ?factor
manual 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:
ggplot2
en realidad requiere cambiar tanto los niveles como los valores? Hm ... voy a cavar este ...