Ordenar en R

Manipulación de datos con R Transformación de datos
Aprende a ordenar datos en R

Ordenar datos en el lenguaje de programación R se puede lograr de varias maneras, dependiendo de cómo quieras ordenarlos. En este tutorial aprenderás cómo ordenar en R en orden ascendente, descendente o alfabético o cómo ordenar en función de otro vector en varias estructuras de datos con las funciones sort y order.

La función order() en R

La función order devuelve una permutación del orden de los elementos de un vector. La sintaxis con descripciones resumidas de los argumentos es la siguiente:

order(x, # Secuencia de vectores de la misma longitud
      decreasing = FALSE, # Ordenar en orden creciente (FALSE) o decreciente (TRUE)
      na.last = TRUE,     # Poner valores NA al final (TRUE) o al principio (FALSE)
      method = c("auto", "shell", "radix")) # Método usado. Por defecto 'auto'


sort.list(x, # Vector
          decreasing = FALSE,
          partial = NULL,    # Vector de índices para ordenado parcial
          na.last = TRUE,
          method = c("auto", "shell", "quick", "radix"))

La principal diferencia entre order y sort.list es que el primero está diseñado para más de un vector de la misma longitud. Sin embargo, es común usar la función order con un solo vector.

v <- c(34, 47, 25, 14)
order(v)  

# sort.list(v) # Equivalente
4 3 1 2

La salida es un vector de índices, que en este ejemplo significa que si quieres ordenar el vector en orden ascendente, debes colocar el cuarto elemento primero (14), luego el tercero (25), después el primero (34) y el mayor valor será el segundo (47). Si estableces el argumento decreasing como TRUE, tendrás el vector de índices en orden descendente.

order(v, decreasing = TRUE)  
2 1 3 4

Si el vector contiene algún valor NA, estará al final del vector de índices de forma predeterminada.

vec <- c(24, 26, 2, 5, NA, 40, 12, NA)
order(vec)
3 4 7 1 2 6 5 8

Si quieres que los valores NA se muestren al principio, puedes establecer el argumento na.last en FALSE. Si prefieres eliminar los valores NA, puedes usar la función na.omit o utilizar algún procedimiento similar para eliminar valores omitidos.

order(vec, na.last = FALSE)
5 8 3 4 7 1 2 6

También puedes utilizar la función order con vectores de caracteres. Ten en cuenta que ordenar una variable categórica significa ordenarla alfabéticamente.

La función sort() en R

La función sort devuelve ordenado, en orden ascendente por defecto, el vector que pases como entrada.

sort(x,                   # Vector atómico
      decreasing = FALSE, # Ordenar en orden creciente (FALSE) o decrecienete (TRUE)
      na.last = TRUE,     # Poner valores NA al final (TRUE) o al principio (FALSE)
      ...)                # Argumentos adicionales

sort.int(x,                    # Vector atómico o factor
         partial = NULL,       # Vector de índices de ordenación parcial
         decreasing = FALSE,   # Igual que en sort
         na.last = TRUE,       # Igual que en sort
         method = c("auto", "shell", "quick", "radix"), # Método usado. Por defecto 'auto'
         index.return = FALSE, # Delvolver el vector de índices (TRUE) o no (FALSE)
         ...)                  # Argumentos adicionales

Recuerda ejecutar ?sort o help(sort) para obtener ayuda adicional.

Diferencia entre las funciones sort y order en R

Es habitual confundirse entre las funciones sort y order en R. Por un lado, considera el siguiente vector y usa la función order con el:

vector <- c(1, 5.2, 22, 9, -5, 2)

ii <- order(vector)
ii
5 1 6 2 4 3

Si indexas el vector con la salida de la función order, obtendrás el vector inicial ordenado en orden ascendente:

vector[ii]
-5.0  1.0  2.0  5.2  9.0 22.0

Por otro lado, la función sort devolverá por defecto el vector ordenado en orden ascendente. Sin embargo, también puedes obtener el mismo resultado que el que tiene la función order si estableces el argumento index.return como TRUE.

sort(vector, index.return = TRUE)
$`x`
[1] -5.0  1.0  2.0  5.2  9.0 22.0

$ix
[1] 5 1 6 2 4 3

Ordenar vector en R

Hay tres formas diferentes de ordenar un vector: en orden ascendente, en orden descendente o en función del índice de otro vector de la misma longitud. Para esta sección, vamos a utilizar el siguiente vector de muestra:

x <- c(56, 14, 1, 28)

Ten en cuenta que cuando trabajes con un vector grande, puedes usar la función is.unsorted para verificar si el vector está ordenado o no, en lugar de verificar visualmente el orden.

is.unsorted(x) # TRUE

Orden ascendente

Ordenar de forma ascendente significa que los valores se ordenarán de menor a mayor. Para ello, puedes utilizar las funciones order y sort de la siguiente manera:

x[order(x)]

# Equivalente a:
ii <- order(x)
x[ii]

# Equivalente a:
sort(x)
1 14 28 56

Orden descendente

Ordenar un vector de forma descendente significa ordenar los elementos de mayor a menor. Para ese propósito, puedes ordenar el opuesto del vector (con el signo menos) o establecer el argumento decreasing = TRUE de la siguiente manera:

x[order(-x)]

# Equivalente a:
x[order(x, decreasing = TRUE)]

# Equivalente a:
sort(x, decreasing = TRUE)
56 28 14 1

Ordenar por otro vector

Puedes ordenar un vector utilizando otro de la misma longitud como índice. En el siguiente ejemplo, el vector y indica que el segundo elemento del vector x (14) debe ser el primero, el tercero (1) el segundo, el primero (56) el tercero y finalmente el cuarto (28).

y <- c(2, 3, 1, 4)
x[y]
14 1 56 28

También podrías usar el índice de ordenación del vector y para ordenar el vector x.

# order(y) # 3 1 2 4
x[order(y)]
 1 56 14 28

Ordenar un data frame o una matriz en R

Cuando trabajes con una matriz o un data frame en R, puedes ordenar los datos por filas o por columnas. Ten en cuenta que esta explicación también sirve para ordenar matrices. Para explicar cómo ordenar un data frame, vamos a utilizar el conjunto de datos attitude de R base.

mi_df <- attitude[, c(2, 3, 4)]
head(mi_df)
     complaints  privileges  learning
1         51          30        39
2         64          51        54
3         70          68        69
4         63          45        47
5         78          56        66
6         55          49        44

Ordenar data frame por columna

Supón que quieres ordenar el data frame por la columna privileges en orden ascendente. Para ese propósito puedes escribir:

# Ordenando por la columna 'privileges'
df_ordenado <- mi_df[order(mi_df$privileges), ]

# Primeras filas
head(df_ordenado)
      complaints  privileges  learning
1          51         30        39
21         40         33        34
30         82         39        59
7          67         42        56
24         37         42        58
25         54         42        48

Nótese que en caso de empate, el orden se basa en el índice de las filas.

En caso de que necesites ordenar tu data frame por varias columnas, especifica más columnas dentro de la función order. Esto es muy útil cuando la columna principal que estás ordenando tiene empates.

# Ordenando por la columna 'privileges' y luego por la columna 'complaints' en caso de empate
df_ordenado <- mi_df[order(mi_df$privileges, mi_df$complaints), ]

# Primeras filas
head(df_ordenado)
   complaints privileges learning
1          51         30       39
21         40         33       34
30         82         39       59
24         37         42       58      # <- Nota la diferencia
25         54         42       48      # respecto a la salida anterior
7          67         42       56

Fíjate que la columna complaints ahora está ordenada para aquellos valores donde la columna privileges tiene valores repetidos.

Cambiar el orden de las filas y columnas en R

Puedes cambiar el orden de las columnas en R cambiando el orden del índice que define las columnas. También puedes invertir el orden con una secuencia desde el número de columnas del data frame hasta 1.

# Order personalizado de las columnas
mi_df[, c(2, 1, 3)] 

# Orden inverso de las columnas
mi_df[, ncol(mi_df):1]

De manera equivalente, puedes cambiar el orden de las filas:

# Orden personalizado de las filas (aleatorio)
mi_df[sample(nrow(mi_df), replace = FALSE), ]

# Orden inverso de las filas
mi_df[nrow(mi_df):1, ]

Ordenar filas por orden alfabético

Considera el siguiente data frame de muestra, donde a cada fila se le ha asignado como nombre una letra de manera aleatoria.

set.seed(4)
mi_df <- data.frame(x = 1:10, y = 12:21)
rownames(mi_df) <- sample(letters, nrow(mi_df))
mi_df
   x  y
p  1 12
a  2 13
h  3 14
g  4 15
r  5 16
f  6 17
o  7 18
v  8 19
s  9 20
b 10 21

Puedes ordenar las filas alfabéticamente con las funciones order y rownames de la siguiente manera:

mi_df[order(rownames(mi_df)), ]
   x  y
a  2 13
b 10 21
f  6 17
g  4 15
h  3 14
o  7 18
p  1 12
r  5 16
s  9 20
v  8 19

Ordenar una lista en R

En esta sección aprenderás cómo ordenar una lista en R. Hay tres formas de ordenar una lista en R: ordenar los elementos por orden alfabético, crear un orden personalizado u ordenar un elemento específico de la lista. Considera la siguiente lista de muestra:

lista <- list(b = 1:10, a = letters[1:5], c = matrix(1:2, ncol = 2))
lista
$`b`
 [1]  1  2  3  4  5  6  7  8  9 10

$a
[1] "a" "b" "c" "d" "e"

$c
     [,1] [,2]
[1,]    1    2

Puedes ordenar elementos de la lista alfabéticamente utilizando las funciones order y names de la siguiente manera:

# Ordenar los elementos alfabéticamente
lista[order(names(lista))]
$`a`
[1] "a" "b" "c" "d" "e"

$b
 [1]  1  2  3  4  5  6  7  8  9 10

$c
     [,1] [,2]
[1,]    1    2

Si lo prefieres, puedes crear manualmente un orden personalizado especificando los nombres o el índice de los elementos dentro de la función c.

# Orden personalizado
lista[c("b", "c", "a")]
lista[c(1, 3, 2)] # Equivalente
$`b`
 [1]  1  2  3  4  5  6  7  8  9 10

$c
     [,1] [,2]
[1,]    1    2

$a
[1] "a" "b" "c" "d" "e"

Finalmente, podría ser interesante ordenar un elemento de la lista en concreto. En el siguiente caso, la ordenación será lo mismo que ordenar un vector.

# Ordenar un elemento de la lista
sort(lista$b, decreasing = TRUE)

Ordenar datos categóricos

Se puede ordenar vectores de caracteres o datos categóricos en R de diferentes maneras. Considera la siguiente variable categórica:

set.seed(1)
datos_categoricos <- rownames(mtcars)[sample(10)]
datos_categoricos
"Datsun 710" "Hornet 4 Drive" "Hornet Sportabout" "Duster 360" "Mazda RX4 Wag"
"Merc 240D" "Merc 230" "Valiant" "Merc 280" "Mazda RX4" 

Para ordenar la variable en orden alfabético puedes hacer uso de la función sort, como revisamos en la sección sobre ordenación de vectores. Si la variable contiene números en forma de caracteres también se ordenarán correctamente.

sort(datos_categoricos)

Una alternativa para ordenar una variable categórica alfabéticamente en R es convertirla a factor y luego ordenarla.

sort(factor(datos_categoricos))
Datsun 710        Duster 360        Hornet 4 Drive    Hornet Sportabout
Mazda RX4         Mazda RX4 Wag     Merc 230          Merc 240D        
Merc 280          Valiant          
Levels: Datsun 710 Duster 360 Hornet 4 Drive Hornet Sportabout ... Valiant

Sin embargo, si quieres devolver el índice de ordenación de los factores en R, deberás usar la función sort.int para usar el argumento index.return.

sort.int(factor(datos_categoricos), index.return = TRUE)
$`x`
 [1] Datsun 710        Duster 360        Hornet 4 Drive    Hornet Sportabout
 [5] Mazda RX4         Mazda RX4 Wag     Merc 230          Merc 240D        
 [9] Merc 280          Valiant          
10 Levels: Datsun 710 Duster 360 Hornet 4 Drive Hornet Sportabout ... Valiant

$ix
 [1]  1  4  2  3 10  5  7  6  9  8