Ordenar 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