Ordenar filas en R con la función arrange() de dplyr

Ordenar filas en R con 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 las filas en orden ascendente en R con la función arrange de dplyr

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 en orden descendente con la función desc() en dplyr

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 por nombre en dplyr

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  

Ordenar filas por varias columnas en dplyr

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 en base a dos columnas en dplyr con la función arrange()

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 

Ordenar filas por grupo en dplyr