varias sirve que para ordenar ordenados los grafico graficas factores factor escala ejes como cambiar barras r levels

sirve - Reordenar los niveles de un factor sin cambiar el orden de los valores



para que sirve factor en r (7)

Tengo un marco de datos con algunas variables numéricas y algunas variables de factor categóricos. El orden de los niveles para esos factores no es la forma en que 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 (mis datos son totalmente absurdos a partir de este momento).

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 tanto, al trazar, las barras se muestran en el orden deseado, lo que puede diferir del orden alfabético predeterminado.


Aquí está mi función para reordenar factores de un marco de datos dado:

reorderFactors <- function(df, column = "my_column_name", desired_level_order = c("fac1", "fac2", "fac3")) { x = df[[column]] lvls_src = levels(x) idxs_target <- vector(mode="numeric", length=0) for (target in desired_level_order) { idxs_target <- c(idxs_target, which(lvls_src == target)) } x_new <- factor(x,levels(x)[idxs_target]) df[[column]] <- x_new return (df) }

Uso: reorderFactors(df, "my_col", desired_level_order = c("how","I","want"))


Desde que esta pregunta fue activa por última vez, Hadley ha lanzado su nuevo paquete de forcats para manipular factores y me resulta escandalosamente útil. Ejemplos del marco de datos de OP:

levels(df$letters) # [1] "a" "b" "c" "d"

Para revertir los niveles:

library(forcats) fct_rev(df$letters) %>% levels # [1] "d" "c" "b" "a"

Para agregar más niveles:

fct_expand(df$letters, "e") %>% levels # [1] "a" "b" "c" "d" "e"

Y muchas más funciones fct_xxx() útiles.


Deseo agregar otro caso en el que los niveles puedan ser cadenas que lleven números junto con algunos caracteres especiales: como el siguiente ejemplo

df <- data.frame(x = c("15-25", "0-4", "5-10", "11-14", "100+"))

Los niveles predeterminados de x son:

df$x # [1] 15-25 0-4 5-10 11-14 100+ # Levels: 0-4 100+ 11-14 15-25 5-10

Aquí, si queremos reordenar los niveles de factor de acuerdo con el valor numérico, sin escribir explícitamente los niveles, lo que podríamos hacer es

library(gtools) df$x <- factor(df$x, levels = mixedsort(df$x)) df$x # [1] 15-25 0-4 5-10 11-14 100+ # Levels: 0-4 5-10 11-14 15-25 100+ as.numeric(df$x) # [1] 4 1 2 3 5

Espero que esto pueda ser considerado como información útil para futuros lectores.


Tratar con factores en R es un trabajo bastante peculiar, debo admitirlo ... Al reordenar los niveles de los factores, no se están reordenando 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 en 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 ... cambiando los niveles, solo cambia los niveles (¿quién lo diría, eh?), ¡No los valores numéricos! Pero, cuando usas la función factor como @Jonathan Chang sugirió, sucede algo diferente: tú mismo cambias 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! No use levels o ensuciará las cosas (a menos que sepa exactamente lo que está haciendo).

Una pequeña sugerencia: evite nombrar sus objetos con un nombre idéntico a los objetos de R ( df es la función de densidad para la distribución F, las letters dan letters 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? =)

En cambio, use algo como esto (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

Tenga en cuenta que también puede nombrarle data.frame con df y letters lugar de g , y el resultado será correcto. En realidad, este código es idéntico al que publicaste, solo cambian los nombres. Este factor(dtf$letter, levels = letters[4:1]) parte factor(dtf$letter, levels = letters[4:1]) no arrojaría un error, ¡pero puede ser confuso!

¡Lea el manual de ?factor de fondo! ¿Cuál es la diferencia entre factor(g, levels = letters[4:1]) y factor(g, labels = letters[4:1]) ? ¿Qué es similar en los levels(g) <- letters[4:1] g <- factor(g, labels = letters[4:1]) ?

¡Puedes poner la sintaxis de ggplot para que podamos ayudarte más en esto!

¡¡¡Aclamaciones!!!

Editar:

ggplot2 realidad requiere cambiar ambos niveles y valores? Hm ... Voy a cavar este ...


Use el argumento de levels de factor :

df <- data.frame(f = 1:4, g = letters[1:4]) df # f g # 1 1 a # 2 2 b # 3 3 c # 4 4 d levels(df$g) # [1] "a" "b" "c" "d" df$g <- factor(df$g, levels = letters[4:1]) # levels(df$g) # [1] "d" "c" "b" "a" df # f g # 1 1 a # 2 2 b # 3 3 c # 4 4 d


entonces, lo que quiere, en R léxico, es cambiar solo las etiquetas de una variable de factor dada (es decir, deje los datos y los niveles de los factores, sin cambios).

df$letters = factor(df$letters, labels=c("d", "c", "b", "a"))

dado que desea cambiar solo el mapeo de punto a punto de datos y no los datos o el esquema de factores (cómo los puntos de datos se agrupan en intervalos individuales o valores de factores, podría ser útil saber cómo se estableció originalmente el mapeo cuando creó inicialmente el factor.

las reglas son simples:

  • las etiquetas se asignan a niveles por valor de índice (es decir, el valor en los niveles [2] recibe la etiqueta, etiqueta [2]);
  • los niveles de los factores se pueden establecer explícitamente pasándolos a través del argumento de los niveles ; o
  • si no se proporciona ningún valor para el argumento de niveles, se utiliza el valor predeterminado que es la llamada de resultado única en el vector de datos pasado (para el argumento de datos );
  • las etiquetas pueden establecerse explícitamente a través del argumento labels; o
  • si no se proporciona ningún valor para el argumento labels, se usa el valor predeterminado que es solo el vector de niveles

un poco más, solo para el registro

## reorder is a base function df$letters <- reorder(df$letters, new.order=letters[4:1]) library(gdata) df$letters <- reorder.factor(df$letters, letters[4:1])

También puede encontrar Relevel y combine_factor útiles.