Tutorial sobre como reordenar las filas de un Data Frame en R.

Puedes seguir el tutorial por vídeo en https://youtu.be/bovzOVZDsyA

Establezco el directorio de trabajo

setwd("~/Expression/Expression Encoder/Output/31 Odenar Data Frame II - Ordenar filas")

En el vídeo como “Unir Data Frames” vimos que para utilizar el comando cbind(), uno de los requisitos era que las filas de los DF que íbamos a unir estuvieran en el mismo orden. Veamos que pasa si no están en el mismo orden.

DatosTesPeso = read.table("PotatoTestigoFilOrdPeso.csv", header=T, sep="," , dec=".")
DatosTesNr = read.table("PotatoTestigoFilOrdNr.csv", header=T, sep="," , dec=".")
DatosTesPeso
##   Tratamiento Variedad Parcela Peso40 Peso41a45 Peso46a60 PesoMas61
## 1     Testigo    Krone       1    380      1120     16180      2360
## 2     Testigo    Krone       2   2000      1480     15600      2340
## 3     Testigo    Krone       3    820       920     14840      6580
## 4     Testigo    Krone       4    130      1120     17180     11780
## 5     Testigo    Krone       5   1840      1240     12580      7040
## 6     Testigo   Nicola       6    700       300      8810       420
## 7     Testigo   Nicola       7   3340      3480     12700       680
## 8     Testigo   Nicola       8   2730      1800     11080       500
## 9     Testigo   Nicola       9    930      1940     11080       500
DatosTesNr
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 1     Testigo   Nicola       6       12           5          63
## 2     Testigo   Nicola       9       17          26          92
## 3     Testigo   Nicola       8       34          37          95
## 4     Testigo    Krone       5       22          16         101
## 5     Testigo   Nicola       7       71          47         101
## 6     Testigo    Krone       2       42          25         124
## 7     Testigo    Krone       4        3          16         125
## 8     Testigo    Krone       3       16          13         129
## 9     Testigo    Krone       1        9          23         130
##   NumeroMas61
## 1           2
## 2           2
## 3           2
## 4          30
## 5           3
## 6          14
## 7          44
## 8          28
## 9          16

¿Qué ocurre si unimos los DF tal y como están?

DatosTotal = cbind(DatosTesPeso, DatosTesNr)
DatosTotal
##   Tratamiento Variedad Parcela Peso40 Peso41a45 Peso46a60 PesoMas61
## 1     Testigo    Krone       1    380      1120     16180      2360
## 2     Testigo    Krone       2   2000      1480     15600      2340
## 3     Testigo    Krone       3    820       920     14840      6580
## 4     Testigo    Krone       4    130      1120     17180     11780
## 5     Testigo    Krone       5   1840      1240     12580      7040
## 6     Testigo   Nicola       6    700       300      8810       420
## 7     Testigo   Nicola       7   3340      3480     12700       680
## 8     Testigo   Nicola       8   2730      1800     11080       500
## 9     Testigo   Nicola       9    930      1940     11080       500
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 1     Testigo   Nicola       6       12           5          63
## 2     Testigo   Nicola       9       17          26          92
## 3     Testigo   Nicola       8       34          37          95
## 4     Testigo    Krone       5       22          16         101
## 5     Testigo   Nicola       7       71          47         101
## 6     Testigo    Krone       2       42          25         124
## 7     Testigo    Krone       4        3          16         125
## 8     Testigo    Krone       3       16          13         129
## 9     Testigo    Krone       1        9          23         130
##   NumeroMas61
## 1           2
## 2           2
## 3           2
## 4          30
## 5           3
## 6          14
## 7          44
## 8          28
## 9          16

Los mas lógico parece ordenar el DF “DatosTesNr”" para que el orden de las observaciones coincida con el de las parcelas, tal y como ocurre en el DF “DatosTesPeso”. Para ordenar el DF poniendo las observaciones de la parcela 1 en la primera posición y el de la 9 en la úlitma, utilizaremos el siguiente comando.

DatosTesNr [order(DatosTesNr$Parcela), ]
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 9     Testigo    Krone       1        9          23         130
## 6     Testigo    Krone       2       42          25         124
## 8     Testigo    Krone       3       16          13         129
## 7     Testigo    Krone       4        3          16         125
## 4     Testigo    Krone       5       22          16         101
## 1     Testigo   Nicola       6       12           5          63
## 5     Testigo   Nicola       7       71          47         101
## 3     Testigo   Nicola       8       34          37          95
## 2     Testigo   Nicola       9       17          26          92
##   NumeroMas61
## 9          16
## 6          14
## 8          28
## 7          44
## 4          30
## 1           2
## 5           3
## 3           2
## 2           2
DatosTesNr1 = DatosTesNr [order(DatosTesNr$Parcela), ]
DatosTesNr # Orden del DF al cargarlo
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 1     Testigo   Nicola       6       12           5          63
## 2     Testigo   Nicola       9       17          26          92
## 3     Testigo   Nicola       8       34          37          95
## 4     Testigo    Krone       5       22          16         101
## 5     Testigo   Nicola       7       71          47         101
## 6     Testigo    Krone       2       42          25         124
## 7     Testigo    Krone       4        3          16         125
## 8     Testigo    Krone       3       16          13         129
## 9     Testigo    Krone       1        9          23         130
##   NumeroMas61
## 1           2
## 2           2
## 3           2
## 4          30
## 5           3
## 6          14
## 7          44
## 8          28
## 9          16
DatosTesNr1
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 9     Testigo    Krone       1        9          23         130
## 6     Testigo    Krone       2       42          25         124
## 8     Testigo    Krone       3       16          13         129
## 7     Testigo    Krone       4        3          16         125
## 4     Testigo    Krone       5       22          16         101
## 1     Testigo   Nicola       6       12           5          63
## 5     Testigo   Nicola       7       71          47         101
## 3     Testigo   Nicola       8       34          37          95
## 2     Testigo   Nicola       9       17          26          92
##   NumeroMas61
## 9          16
## 6          14
## 8          28
## 7          44
## 4          30
## 1           2
## 5           3
## 3           2
## 2           2

Ahora ya sí podríamos utilizar rbind()

DatosTotal = cbind(DatosTesPeso, DatosTesNr1)
DatosTotal
##   Tratamiento Variedad Parcela Peso40 Peso41a45 Peso46a60 PesoMas61
## 9     Testigo    Krone       1    380      1120     16180      2360
## 6     Testigo    Krone       2   2000      1480     15600      2340
## 8     Testigo    Krone       3    820       920     14840      6580
## 7     Testigo    Krone       4    130      1120     17180     11780
## 4     Testigo    Krone       5   1840      1240     12580      7040
## 1     Testigo   Nicola       6    700       300      8810       420
## 5     Testigo   Nicola       7   3340      3480     12700       680
## 3     Testigo   Nicola       8   2730      1800     11080       500
## 2     Testigo   Nicola       9    930      1940     11080       500
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 9     Testigo    Krone       1        9          23         130
## 6     Testigo    Krone       2       42          25         124
## 8     Testigo    Krone       3       16          13         129
## 7     Testigo    Krone       4        3          16         125
## 4     Testigo    Krone       5       22          16         101
## 1     Testigo   Nicola       6       12           5          63
## 5     Testigo   Nicola       7       71          47         101
## 3     Testigo   Nicola       8       34          37          95
## 2     Testigo   Nicola       9       17          26          92
##   NumeroMas61
## 9          16
## 6          14
## 8          28
## 7          44
## 4          30
## 1           2
## 5           3
## 3           2
## 2           2

Este era un ejemplo fácil, porque el DF de referencia estaba ordenado según el orden creciente (del 1 al 9) de una variable numérica. ¿Cómo lo haríamos si la variable “Parcela” del DF de referencia no estuviera ordenado de forma creciente?

DatosTesPeso = read.table("PotatoTestigoFilOrd2Peso.csv", header=T, sep="," , dec=".")
DatosTesNr = read.table("PotatoTestigoFilOrdNr.csv", header=T, sep="," , dec=".")
DatosTesPeso
##   Tratamiento Variedad Parcela Peso40 Peso41a45 Peso46a60 PesoMas61
## 1     Testigo    Krone       4    130      1120     17180     11780
## 2     Testigo    Krone       1    380      1120     16180      2360
## 3     Testigo   Nicola       6    700       300      8810       420
## 4     Testigo    Krone       3    820       920     14840      6580
## 5     Testigo   Nicola       9    930      1940     11080       500
## 6     Testigo    Krone       5   1840      1240     12580      7040
## 7     Testigo    Krone       2   2000      1480     15600      2340
## 8     Testigo   Nicola       8   2730      1800     11080       500
## 9     Testigo   Nicola       7   3340      3480     12700       680
DatosTesNr
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 1     Testigo   Nicola       6       12           5          63
## 2     Testigo   Nicola       9       17          26          92
## 3     Testigo   Nicola       8       34          37          95
## 4     Testigo    Krone       5       22          16         101
## 5     Testigo   Nicola       7       71          47         101
## 6     Testigo    Krone       2       42          25         124
## 7     Testigo    Krone       4        3          16         125
## 8     Testigo    Krone       3       16          13         129
## 9     Testigo    Krone       1        9          23         130
##   NumeroMas61
## 1           2
## 2           2
## 3           2
## 4          30
## 5           3
## 6          14
## 7          44
## 8          28
## 9          16

Ninguno de los DF está ordenado de la misma manera. Vamos a ordenar el DF “DatosTesNr” según el orden de parcela que tiene el DF “DatosTesPeso”

DatosTesNr[order(match(DatosTesNr[,3],DatosTesPeso[,3])),]
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 7     Testigo    Krone       4        3          16         125
## 9     Testigo    Krone       1        9          23         130
## 1     Testigo   Nicola       6       12           5          63
## 8     Testigo    Krone       3       16          13         129
## 2     Testigo   Nicola       9       17          26          92
## 4     Testigo    Krone       5       22          16         101
## 6     Testigo    Krone       2       42          25         124
## 3     Testigo   Nicola       8       34          37          95
## 5     Testigo   Nicola       7       71          47         101
##   NumeroMas61
## 7          44
## 9          16
## 1           2
## 8          28
## 2           2
## 4          30
## 6          14
## 3           2
## 5           3
DatosTesNr2 = DatosTesNr[order(match(DatosTesNr$Parcela,DatosTesPeso$Parcela)),]

DatosTesPeso
##   Tratamiento Variedad Parcela Peso40 Peso41a45 Peso46a60 PesoMas61
## 1     Testigo    Krone       4    130      1120     17180     11780
## 2     Testigo    Krone       1    380      1120     16180      2360
## 3     Testigo   Nicola       6    700       300      8810       420
## 4     Testigo    Krone       3    820       920     14840      6580
## 5     Testigo   Nicola       9    930      1940     11080       500
## 6     Testigo    Krone       5   1840      1240     12580      7040
## 7     Testigo    Krone       2   2000      1480     15600      2340
## 8     Testigo   Nicola       8   2730      1800     11080       500
## 9     Testigo   Nicola       7   3340      3480     12700       680
DatosTesNr2
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 7     Testigo    Krone       4        3          16         125
## 9     Testigo    Krone       1        9          23         130
## 1     Testigo   Nicola       6       12           5          63
## 8     Testigo    Krone       3       16          13         129
## 2     Testigo   Nicola       9       17          26          92
## 4     Testigo    Krone       5       22          16         101
## 6     Testigo    Krone       2       42          25         124
## 3     Testigo   Nicola       8       34          37          95
## 5     Testigo   Nicola       7       71          47         101
##   NumeroMas61
## 7          44
## 9          16
## 1           2
## 8          28
## 2           2
## 4          30
## 6          14
## 3           2
## 5           3

Ahora, también podríamos utilizar rbind()

DatosTotal2 = cbind(DatosTesPeso, DatosTesNr2)
DatosTotal2
##   Tratamiento Variedad Parcela Peso40 Peso41a45 Peso46a60 PesoMas61
## 7     Testigo    Krone       4    130      1120     17180     11780
## 9     Testigo    Krone       1    380      1120     16180      2360
## 1     Testigo   Nicola       6    700       300      8810       420
## 8     Testigo    Krone       3    820       920     14840      6580
## 2     Testigo   Nicola       9    930      1940     11080       500
## 4     Testigo    Krone       5   1840      1240     12580      7040
## 6     Testigo    Krone       2   2000      1480     15600      2340
## 3     Testigo   Nicola       8   2730      1800     11080       500
## 5     Testigo   Nicola       7   3340      3480     12700       680
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 7     Testigo    Krone       4        3          16         125
## 9     Testigo    Krone       1        9          23         130
## 1     Testigo   Nicola       6       12           5          63
## 8     Testigo    Krone       3       16          13         129
## 2     Testigo   Nicola       9       17          26          92
## 4     Testigo    Krone       5       22          16         101
## 6     Testigo    Krone       2       42          25         124
## 3     Testigo   Nicola       8       34          37          95
## 5     Testigo   Nicola       7       71          47         101
##   NumeroMas61
## 7          44
## 9          16
## 1           2
## 8          28
## 2           2
## 4          30
## 6          14
## 3           2
## 5           3

Otras opciones para ordenar un DF es por ejemplo en orden decreciente de una variable numérica.

DatosTesNr
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 1     Testigo   Nicola       6       12           5          63
## 2     Testigo   Nicola       9       17          26          92
## 3     Testigo   Nicola       8       34          37          95
## 4     Testigo    Krone       5       22          16         101
## 5     Testigo   Nicola       7       71          47         101
## 6     Testigo    Krone       2       42          25         124
## 7     Testigo    Krone       4        3          16         125
## 8     Testigo    Krone       3       16          13         129
## 9     Testigo    Krone       1        9          23         130
##   NumeroMas61
## 1           2
## 2           2
## 3           2
## 4          30
## 5           3
## 6          14
## 7          44
## 8          28
## 9          16
DatosTesNr [order(DatosTesNr$Parcela), ]
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 9     Testigo    Krone       1        9          23         130
## 6     Testigo    Krone       2       42          25         124
## 8     Testigo    Krone       3       16          13         129
## 7     Testigo    Krone       4        3          16         125
## 4     Testigo    Krone       5       22          16         101
## 1     Testigo   Nicola       6       12           5          63
## 5     Testigo   Nicola       7       71          47         101
## 3     Testigo   Nicola       8       34          37          95
## 2     Testigo   Nicola       9       17          26          92
##   NumeroMas61
## 9          16
## 6          14
## 8          28
## 7          44
## 4          30
## 1           2
## 5           3
## 3           2
## 2           2
DatosTesNr [rev(order(DatosTesNr$Parcela)), ]
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 2     Testigo   Nicola       9       17          26          92
## 3     Testigo   Nicola       8       34          37          95
## 5     Testigo   Nicola       7       71          47         101
## 1     Testigo   Nicola       6       12           5          63
## 4     Testigo    Krone       5       22          16         101
## 7     Testigo    Krone       4        3          16         125
## 8     Testigo    Krone       3       16          13         129
## 6     Testigo    Krone       2       42          25         124
## 9     Testigo    Krone       1        9          23         130
##   NumeroMas61
## 2           2
## 3           2
## 5           3
## 1           2
## 4          30
## 7          44
## 8          28
## 6          14
## 9          16
DatosTesNr [order(-DatosTesNr$Parcela), ]
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 2     Testigo   Nicola       9       17          26          92
## 3     Testigo   Nicola       8       34          37          95
## 5     Testigo   Nicola       7       71          47         101
## 1     Testigo   Nicola       6       12           5          63
## 4     Testigo    Krone       5       22          16         101
## 7     Testigo    Krone       4        3          16         125
## 8     Testigo    Krone       3       16          13         129
## 6     Testigo    Krone       2       42          25         124
## 9     Testigo    Krone       1        9          23         130
##   NumeroMas61
## 2           2
## 3           2
## 5           3
## 1           2
## 4          30
## 7          44
## 8          28
## 6          14
## 9          16

También la puedo ordenar según el orden de dos variables, una tipo Factor y otra tipo numérica

DatosTesNr
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 1     Testigo   Nicola       6       12           5          63
## 2     Testigo   Nicola       9       17          26          92
## 3     Testigo   Nicola       8       34          37          95
## 4     Testigo    Krone       5       22          16         101
## 5     Testigo   Nicola       7       71          47         101
## 6     Testigo    Krone       2       42          25         124
## 7     Testigo    Krone       4        3          16         125
## 8     Testigo    Krone       3       16          13         129
## 9     Testigo    Krone       1        9          23         130
##   NumeroMas61
## 1           2
## 2           2
## 3           2
## 4          30
## 5           3
## 6          14
## 7          44
## 8          28
## 9          16
DatosTesNr [order(DatosTesNr$Variedad,DatosTesNr$Numero40), ]
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 7     Testigo    Krone       4        3          16         125
## 9     Testigo    Krone       1        9          23         130
## 8     Testigo    Krone       3       16          13         129
## 4     Testigo    Krone       5       22          16         101
## 6     Testigo    Krone       2       42          25         124
## 1     Testigo   Nicola       6       12           5          63
## 2     Testigo   Nicola       9       17          26          92
## 3     Testigo   Nicola       8       34          37          95
## 5     Testigo   Nicola       7       71          47         101
##   NumeroMas61
## 7          44
## 9          16
## 8          28
## 4          30
## 6          14
## 1           2
## 2           2
## 3           2
## 5           3

Si quiero que una de las variables se ordene de forma decreciente, puedo recurrir el signo “-”

DatosTesNr [order(DatosTesNr$Variedad,-DatosTesNr$Numero40), ]
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 6     Testigo    Krone       2       42          25         124
## 4     Testigo    Krone       5       22          16         101
## 8     Testigo    Krone       3       16          13         129
## 9     Testigo    Krone       1        9          23         130
## 7     Testigo    Krone       4        3          16         125
## 5     Testigo   Nicola       7       71          47         101
## 3     Testigo   Nicola       8       34          37          95
## 2     Testigo   Nicola       9       17          26          92
## 1     Testigo   Nicola       6       12           5          63
##   NumeroMas61
## 6          14
## 4          30
## 8          28
## 9          16
## 7          44
## 5           3
## 3           2
## 2           2
## 1           2

Por último, también se puede ordenar con comandos de la librería dplyr

library(dplyr)
## 
## Attaching package: 'dplyr'
## 
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## 
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
DatosTesNr %>% arrange(Parcela)
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 1     Testigo    Krone       1        9          23         130
## 2     Testigo    Krone       2       42          25         124
## 3     Testigo    Krone       3       16          13         129
## 4     Testigo    Krone       4        3          16         125
## 5     Testigo    Krone       5       22          16         101
## 6     Testigo   Nicola       6       12           5          63
## 7     Testigo   Nicola       7       71          47         101
## 8     Testigo   Nicola       8       34          37          95
## 9     Testigo   Nicola       9       17          26          92
##   NumeroMas61
## 1          16
## 2          14
## 3          28
## 4          44
## 5          30
## 6           2
## 7           3
## 8           2
## 9           2
DatosTesNr %>% arrange(Variedad,Numero40)
##   Tratamiento Variedad Parcela Numero40 Numero41a45 Numero46a60
## 1     Testigo    Krone       4        3          16         125
## 2     Testigo    Krone       1        9          23         130
## 3     Testigo    Krone       3       16          13         129
## 4     Testigo    Krone       5       22          16         101
## 5     Testigo    Krone       2       42          25         124
## 6     Testigo   Nicola       6       12           5          63
## 7     Testigo   Nicola       9       17          26          92
## 8     Testigo   Nicola       8       34          37          95
## 9     Testigo   Nicola       7       71          47         101
##   NumeroMas61
## 1          44
## 2          16
## 3          28
## 4          30
## 5          14
## 6           2
## 7           2
## 8           2
## 9           3