Cómo ordenar dataframe en base a múltiples columnas en R

Publicado el 07 abril 2021 por Daniel Rodríguez @analyticslane

Una tarea bastante habitual cuando se trabaja con conjuntos de datos es ordenar los registros en base los valores de una o varias columnas. Por ejemplo, buscar los clientes con mayor número de visitas y, a igual número de visitas, ordenarlos por gasto. Lo que se pude conseguir fácilmente en R. Únicamente hay que combinar el uso de order() con with() para poder ordenar dataframe en base a múltiples columnas.

La funciones order() y with()

La función order() permite devolver la permutación con la que se puede ordenar el vector que se le ha pasado como parámetro. Una ordenación que puede ser tanto creciente como decreciente. En el caso de que el parámetro sea un conjunto de datos, la permutación se basa en los valores de la primera columna. Por lo que es ampliamente utilizado para ordenar conjuntos de datos.

Por otro lado, la función with() permite la evaluación de una expresión en un conjunto de datos. Lo que simplifica la evaluación de funciones en estos elementos.

Ordenar dataframe en base a una columna

Para ver cómo se pueden combinar las funciones order() y with() vamos a utilizar el conjunto de datos incluido en R mtcars. Un conjunto en el que se puede consultar diferentes datos de 32 coches. Conjunto de datos cuyos primeros registros son

 mpg cyl disp hp drat wt qsec vs am gear carb Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1

Uno de los datos que se puede consultar es el número de marchas ( gear) del modelo. En el caso querer ordenar los datos por este valor simplemente tenemos que hacer

mtcars[with(mtcars, order(gear)), ]

Esto es, indicar mediante with() que se aplique la función order() a la columna gear del conjunto de datos mtcars. Usando el valor obtenido para ordenar el conjunto de datos inicial. Ahora, los primeros registros del conjunto de datos ordenados son

 mpg cyl disp hp drat wt qsec vs am gear carb Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3

Por defecto la ordenación es ascendente, aunque es muy fácil cambiar el orden. Simplemente hay que indicar el nombre de la variable con un signo - delante para cambiar el orden, esto es:

mtcars[with(mtcars, order(-gear)), ]

Con lo que ahora los primeros registros del conjunto de datos pasan a ser

 mpg cyl disp hp drat wt qsec vs am gear carb Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2 Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2 Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4

Ordenar dataframe en base a múltiples columnas

Una vez ordenados los vehículos en base al número de marchas puede que nos interese saber cuales tienen un mayor consumo. Valor que se encuentra en la columna mpg. Para que los datos se ordenen en segundo lugar por esta solamente hay que pasarla como segundo parámetro de la función order(). Así para ordenar el conjunto de mayor a menor consumo solo hay que escribir

mtcars[with(mtcars, order(-gear, mpg)), ]

Obteniendo como primeros registros de este conjunto los siguientes valores

 mpg cyl disp hp drat wt qsec vs am gear carb Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.6 0 1 5 8 Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.5 0 1 5 4 Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.5 0 1 5 6 Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.7 0 1 5 2 Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.9 1 1 5 2 Merc 280C 17.8 6 167.6 123 3.92 3.440 18.9 1 0 4 4

Esto es los cinco primeros registros son los cinco vehículos con cinco marchas. Entre ellos el primero es el Maserati Bora con el mayor consumo 15 millas por galón, mientras que el que tiene menor consumo es el quinto, el Lotus Europa con 30,4 millas por galón. Obtenido así el resultado que nos habíamos planteado.

Obviamente, en el caso de que deseemos ordenar los datos en base a una tercera columna, solamente se tendría que agregar esta a la función order(). Siendo posible ordenar cada una de ellas tanto en orden ascendente como descendente.

Conclusiones

En esta ocasión hemos visto un pequeño truco para ordenar dataframe en base a múltiples columnas en R. Este truco es muy útil en las fases previas de análisis de datos, ya que permite ordenar estos con una gran flexibilidad.

Image by Michael Schwarzenberger from Pixabay