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.

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