Ordenar filas en R con la función arrange() de dplyr
La función arrange
de dplyr se utiliza para reordenar las filas de un data frame basándose en los valores de una o más columnas. Por defecto ordena las filas en orden ascendente y permite ordenarlas en orden descendente utilizando la función desc
.
Datos de ejemplo
En este tutorial utilizaremos la siguiente muestra del conjunto de datos starwars
de dplyr
que contiene 10 filas y cuatro columnas.
library(dplyr)
df <- starwars[1:10, c(1, 2, 3, 11)]
df
# A tibble: 10 × 4
name height mass species
<chr> <int> <dbl> <chr>
1 Luke Skywalker 172 77 Human
2 C-3PO 167 75 Droid
3 R2-D2 96 32 Droid
4 Darth Vader 202 136 Human
5 Leia Organa 150 49 Human
6 Owen Lars 178 120 Human
7 Beru Whitesun lars 165 75 Human
8 R5-D4 97 32 Droid
9 Biggs Darklighter 183 84 Human
10 Obi-Wan Kenobi 182 77 Human
Ordenar por una columna
La función arrange
ordena las filas por la columna especificada en orden ascendente por defecto. El siguiente ejemplo muestra cómo ordenar la columna height
(altura) en orden ascendente.
library(dplyr)
df <- starwars[1:10, c(1, 2, 3, 11)]
# Ordenar por altura (height) en orden ASCENDENTE
df_2 <- df %>%
arrange(height)
df_2
# A tibble: 10 × 4
name height mass species
<chr> <int> <dbl> <chr>
1 R2-D2 96 32 Droid
2 R5-D4 97 32 Droid
3 Leia Organa 150 49 Human
4 Beru Whitesun lars 165 75 Human
5 C-3PO 167 75 Droid
6 Luke Skywalker 172 77 Human
7 Owen Lars 178 120 Human
8 Obi-Wan Kenobi 182 77 Human
9 Biggs Darklighter 183 84 Human
10 Darth Vader 202 136 Human
Ordenar filas en orden descendente
Si quieres ordenar las filas en orden descendente, tendrás que colocar la variable que quieras usar para ordenar en la función desc
, como se ilustra a continuación.
library(dplyr)
df <- starwars[1:10, c(1, 2, 3, 11)]
# Ordenar por altura (height) en orden DESCENDENTE
df_2 <- df %>%
arrange(desc(height))
df_2
# A tibble: 10 × 4
name height mass species
<chr> <int> <dbl> <chr>
1 Darth Vader 202 136 Human
2 Biggs Darklighter 183 84 Human
3 Obi-Wan Kenobi 182 77 Human
4 Owen Lars 178 120 Human
5 Luke Skywalker 172 77 Human
6 C-3PO 167 75 Droid
7 Beru Whitesun lars 165 75 Human
8 Leia Organa 150 49 Human
9 R5-D4 97 32 Droid
10 R2-D2 96 32 Droid
Ordenar filas usando funciones
Las filas pueden ordenarse utilizando funciones personalizadas. El siguiente ejemplo ordena la columna name
alfabéticamente, basándose en la primera letra de los nombres.
library(dplyr)
df <- starwars[1:10, c(1, 2, 3, 11)]
# Ordena 'name' por la primera letra de los nombres
df_2 <- df %>%
arrange(substr(name, 1, 1))
df_2
# A tibble: 10 × 4
name height mass species
<chr> <int> <dbl> <chr>
1 Beru Whitesun lars 165 75 Human
2 Biggs Darklighter 183 84 Human
3 C-3PO 167 75 Droid
4 Darth Vader 202 136 Human
5 Luke Skywalker 172 77 Human
6 Leia Organa 150 49 Human
7 Owen Lars 178 120 Human
8 Obi-Wan Kenobi 182 77 Human
9 R2-D2 96 32 Droid
10 R5-D4 97 32 Droid
Ordenar filas en base a varias columnas
Las filas también pueden ordenarse por varias columnas. En este caso, la ordenación se produce secuencialmente: se ordena la primera columna, seguida de la segunda, y así sucesivamente. El siguiente ejemplo muestra cómo ordenar filas en función de las variables height
y mass
.
library(dplyr)
df <- starwars[1:10, c(1, 2, 3, 11)]
# Ordenar por 'height' y luego por 'mass'
df_2 <- df %>%
arrange(height, mass)
df_2
# A tibble: 10 × 4
name height mass species
<chr> <int> <dbl> <chr>
1 R2-D2 96 32 Droid
2 R5-D4 97 32 Droid
3 Leia Organa 150 49 Human
4 Beru Whitesun lars 165 75 Human
5 C-3PO 167 75 Droid
6 Luke Skywalker 172 77 Human
7 Owen Lars 178 120 Human
8 Obi-Wan Kenobi 182 77 Human
9 Biggs Darklighter 183 84 Human
10 Darth Vader 202 136 Human
Ahora, observa cómo se ordenan las filas cuando se invierte el orden de las columnas especificadas.
library(dplyr)
df <- starwars[1:10, c(1, 2, 3, 11)]
# Ordenar por 'mass' y luego por 'height'
df_2 <- df %>%
arrange(mass, height)
df_2
# A tibble: 10 × 4
name height mass species
<chr> <int> <dbl> <chr>
1 R2-D2 96 32 Droid
2 R5-D4 97 32 Droid
3 Leia Organa 150 49 Human
4 Beru Whitesun lars 165 75 Human
5 C-3PO 167 75 Droid
6 Luke Skywalker 172 77 Human
7 Obi-Wan Kenobi 182 77 Human
8 Biggs Darklighter 183 84 Human
9 Owen Lars 178 120 Human
10 Darth Vader 202 136 Human
Ordenar filas por grupo
Por último, es importante señalar que puedes ordenar variables dentro de grupos. Para ello, tendrás que agrupar los datos pasando una variable categórica a group_by
y luego especificar .by_group = TRUE
dentro de arrange
.
library(dplyr)
df <- starwars[1:10, c(1, 2, 3, 11)]
# Ordenar 'species' por 'height'
df_2 <- df %>%
group_by(species) %>%
arrange(mass, .by_group = TRUE)
df_2
# A tibble: 10 × 4
# Groups: species [2]
name height mass species
<chr> <int> <dbl> <chr>
1 R2-D2 96 32 Droid
2 R5-D4 97 32 Droid
3 C-3PO 167 75 Droid
4 Leia Organa 150 49 Human
5 Beru Whitesun lars 165 75 Human
6 Luke Skywalker 172 77 Human
7 Obi-Wan Kenobi 182 77 Human
8 Biggs Darklighter 183 84 Human
9 Owen Lars 178 120 Human
10 Darth Vader 202 136 Human