R

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

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

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez

Recent Posts

Cómo Comparar Dos Hipotecas con Todos los Gastos Incluidos

Comparar dos hipotecas parece sencillo: la que tenga el TIN más bajo es la mejor…

4 días ago

Segmentación RFM: cómo clasificar tu cartera de clientes antes de calcular el CLV

En un artículo anterior vimos la fórmula clásica del CLV junto a sus limitaciones. Una…

6 días ago

Los récords con asterisco, o la épica del titular sin contexto – El bestiario de los indicadores económicos absurdos (parte 8 y final)

Y llegamos al final de una serie que había programado para ser de tres entradas.…

2 semanas ago

PSI: Cómo Saber Cuándo tu Modelo de Credit Scoring se ha Degradado

Un modelo de credit scoring no es un artefacto estático. Se construye en un momento…

2 semanas ago

Los indicadores que se autocumplen, o cuando medir es modificar – El bestiario de los indicadores económicos absurdos (parte 7)

En las seis entregas anteriores hemos paseado por casi todos los géneros del disparate económico:…

3 semanas ago

Customer Lifetime Value: la fórmula clásica que todo analista debería dominar

El Customer Lifetime Value (CLV) es, probablemente, la métrica más importante que puede calcular una…

3 semanas ago

This website uses cookies.