Tengo un marco de datos con algunas variables numéricas y algunas factor
variables categóricas . El orden de los niveles para esos factores no es como yo quiero que sean.
numbers <- 1:4
letters <- factor(c("a", "b", "c", "d"))
df <- data.frame(numbers, letters)
df
# numbers letters
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
Si cambio el orden de los niveles, las letras ya no están con sus números correspondientes (a partir de este momento, mis datos no tienen sentido).
levels(df$letters) <- c("d", "c", "b", "a")
df
# numbers letters
# 1 1 d
# 2 2 c
# 3 3 b
# 4 4 a
Simplemente quiero cambiar el orden de nivel , por lo que al trazar, las barras se muestran en el orden deseado, que puede diferir del orden alfabético predeterminado.
Respuestas:
Use el
levels
argumento defactor
:fuente
un poco más, solo para el registro
También puede encontrar Relevel útil y combine_factor .
fuente
reorder(df$letters, seq(4,1))
Desde que esta pregunta estuvo activa por última vez, Hadley ha lanzado su nuevo
forcats
paquete para manipular factores y lo encuentro escandalosamente útil. Ejemplos del marco de datos del OP:Para revertir niveles:
Para agregar más niveles:
Y muchas más
fct_xxx()
funciones útiles .fuente
df %>% mutate(letters = fct_rev(letters))
.entonces, lo que desea, en el léxico R, es cambiar solo las etiquetas para una variable de factor dada (es decir, dejar los datos y los niveles de los factores , sin cambios).
dado que desea cambiar solo la asignación de punto de datos a etiqueta y no los datos o el esquema de factores (cómo se agrupan los puntos de datos en ubicaciones individuales o valores de factores, puede ser útil saber cómo se establece originalmente la asignación cuando crea inicialmente el factor.
las reglas son simples:
fuente
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:
Ahora, si convierte este factor a numérico, obtendrá:
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 nivelarlofactor
. No lo hagas !!! No lo uselevels
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):
Tenga en cuenta que también puede nombrarlo
data.frame
condf
y enletters
lugar deg
, y el resultado estará bien. En realidad, este código es idéntico al publicado, solo se cambian los nombres. ¡Esta partefactor(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 entrefactor(g, levels = letters[4:1])
yfactor(g, labels = letters[4:1])
? ¿Qué es similar enlevels(g) <- letters[4:1]
yg <- 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 ...fuente
Deseo agregar otro caso en el que los niveles podrían ser cadenas con números junto con algunos caracteres especiales: como en el ejemplo a continuación
Los niveles predeterminados de
x
es:Aquí, si queremos reordenar los niveles de factores de acuerdo con el valor numérico, sin escribir explícitamente los niveles, lo que podríamos hacer es
Espero que esto pueda considerarse como información útil para futuros lectores.
fuente
Aquí está mi función para reordenar los factores de un marco de datos dado:
Uso:
reorderFactors(df, "my_col", desired_level_order = c("how","I","want"))
fuente