Manejar los factores en R es un trabajo bastante peculiar, debo admitir ... Al reordenar los niveles de factores, no se están reordenando los valores numéricos subyacentes.He aquí 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 a este factor 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 se puede ver ... al cambiar los niveles, sólo puede cambiarse niveles (¿Quién diría, eh?), ¡no los valores numéricos! Pero cuando se usa la función factor
como @Jonathan Chang sugirió, sucede algo diferente: usted mismo cambia los valores numéricos.
Obtiene el error una vez más porque hace levels
y luego intenta volver a aumentarlo con factor
. ¡No lo hagas! Haga no use levels
o ensuciará las cosas (a menos que sepa exactamente lo que está haciendo).
Una sugerencia lil': evitar nombrar los objetos con un nombre idéntico como objetos de R (df
es función de densidad para la distribución F, letters
da letras del alfabeto en minúsculas). En este caso particular, su código no sería defectuoso, pero a veces puede ser ... pero esto puede crear confusión, y no queremos eso, ¿verdad? =)
su lugar, utilice algo como esto (voy a ir 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
en cuenta que también se puede nombrar data.frame
con df
y letters
en lugar de g
, y el resultado estará bien. En realidad, este código es idéntico al que publicaste, solo cambian los nombres. Esta parte factor(dtf$letter, levels = letters[4:1])
no arrojaría un error, ¡pero puede ser confuso!
leer el manual ?factor
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, ¡así podemos ayudarte más en esto!
¡Salud!
Editar:
ggplot2
requiere realmente para cambiar ambos niveles y valores? Hm ... Voy a desenterrar este ...
Gracias, esto funcionó. Por alguna extraña razón, ahora ggplot ha cambiado correctamente el orden en la leyenda, pero no en la trama. Extraño. – crangos
ggplot2 me requirió cambiar ambos, el orden de los niveles (ver arriba) y el orden de los valores del marco de datos. df <- df [nrow (df): 1,] # reverse – crangos