Cómo reordenar niveles de factores en R

En esta entrada voy a mostrar tres maneras (que vienen a ser la misma) de ordenar los niveles de un factor en R:

  1. La básica
  2. La sofisticada
  3. El atajo

Antes, responderé a una pregunta: ¿por qué reordenar niveles en factores? La mejor respuesta que se me ocurre: si no la sabes, deja de leer ya. Te aseguro que, a poco que trabajes con R, acabarás retomando la lectura.

La forma básica es la siguiente:

# creamos un factor con tres niveles, a, b y c
mi.factor <- factor( sample( letters[1:3], 20, replace = T ) )
levels( mi. factor )    # a, b, c
 
# preferimos la ordenación b, c, a
 
mi.factor <- factor( mi.factor, levels = levels( mi.factor )[ c( 2,3,1 ) ] )
levels( mi.factor )     # b, c, a

Es manual y hay que fabricar a mano la permutación de los índices.

La forma sofisticada puede emplearse cuando la permutación puede definirse mediante una función. Por ejemplo, para ordenarlos alfabéticamente, puede hacerse

mi.factor <- factor( mi.factor, levels = sort( levels( mi.factor ) ) )
levels( mi.factor )    # a, b, c

o también, de una manera algo más general, esto otro:

mi.factor <- factor( mi.factor, levels = levels( mi.factor )[ order( levels( mi.factor ) ) ] )
levels( mi.factor )    # a, b, c

El orden puede determinarlo otra variable. Por ejemplo, en el pedazo de código siguiente, queremos ordenar los niveles del factor según el máximo de los valores correspondientes de un vector numérico de la misma longitud:

mis.valores <- runif( 20 )
tmp <- tapply( mis.valores, mi.factor, max )
mi.factor <- factor( mi.factor, levels = levels( mi.factor )[ order( tmp ) ] )

Para este último tipo de transformaciones (muy frecuente para ordenar gráficos) existe un atajo, la función reorder:

mis.valores <- runif( 20 )
mi.factor <- reorder( mi.factor, mis.valores, max )

¡Es muy instructivo consultar su código fuente!

3 comentarios sobre “Cómo reordenar niveles de factores en R

  1. datanalytics 15 febrero, 2011 19:10

    @jaume
    Cierto, cierto, está relevel, que tiene un uso específico (pone un determinado nivel el primero en la lista de todos ellos sin modificar el uso del resto) pero seguro que muy útil en muchos contextos.

    ¡Gracias por la nota!

  2. Anaximandro 14 marzo, 2013 4:55

    «¿por qué reordenar niveles en factores? La mejor respuesta que se me ocurre: si no la sabes, deja de leer ya. Te aseguro que, a poco que trabajes con R, acabarás retomando la lectura.»

    Creo que es lo mejor que he leído en mucho tiempo…
    Gracias por la ayuda… una masa.

Los comentarios están desabilitados.