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

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

Establezco el directorio de trabajo

setwd("~/Expression/Expression Encoder/Output/30 Odenar Data Frame I - Ordenar columnas")

En el vídeo como “Unir Data Frames” vimos que para utilizar el comando rbind(), uno de los requisitos era que las columnas o variables de los DF que íbamos a unir, tuvieran los mismos nombres y en el v?deo “Renombrar variables” aprendimos a cambiar los nombres para facilitar este proceso. Dije también en el vídeo que otro de los requisitos para utilizar el comando rbind() es que las columnas están ordenados de la misma manera, pero vamos a ver si esto es así o no.

DatosTesPeso = read.table("PotatoTestigoPeso.csv", header=T, sep="," , dec=".")
DatosTdoPeso = read.table("PotatoTratadoPeso3.csv", header=T, sep="," , dec=".")
names (DatosTesPeso)
## [1] "Tratamiento" "Variedad"    "Parcela"     "Peso40"      "Peso41a45"  
## [6] "Peso46a60"   "PesoMas61"
names (DatosTdoPeso)
## [1] "Parcela"     "Variedad"    "Tratamiento" "PesoMas61"   "Peso46a60"  
## [6] "Peso41a45"   "Peso40"

Los nombres de las variables son los mismos, pero no el orden en el que se presentan. Veamos que pasa cuando ejecutamos rbind() en estas condiciones.

DatosPesos = rbind(DatosTesPeso, DatosTdoPeso)
DatosPesos
##    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
## 10     Tratado    Krone      10    700       880     19120      3060
## 11     Tratado    Krone      11    440       680      5880       740
## 12     Tratado    Krone      12   1900      3620     12380       620
## 13     Tratado    Krone      13   1300      2100     12780      1240
## 14     Tratado    Krone      14    620      1620     12940       840
## 15     Tratado   Nicola      15    630      1440     16510      1600
## 16     Tratado   Nicola      16   1120      3430     14700       490
## 17     Tratado   Nicola      17   2120      2690     13850       220
## 18     Tratado   Nicola      18   2600      6720     14340         0

Comprobamos que R ha identificado los nombres de las variables o columnas y los ha reordenado para que coincidan, antes de unirlos. En caso de que por cualquier motivo queramos dar un orden específico al DF, tenemos varias opciones.

Opción 1 Ordenar por el número de índice de las columnas. - Ya hablamos de los índices en el vídeo “Filtrar datos I”

names (DatosTesPeso)
## [1] "Tratamiento" "Variedad"    "Parcela"     "Peso40"      "Peso41a45"  
## [6] "Peso46a60"   "PesoMas61"
names (DatosTdoPeso)
## [1] "Parcela"     "Variedad"    "Tratamiento" "PesoMas61"   "Peso46a60"  
## [6] "Peso41a45"   "Peso40"
DatosTdoPeso1 = DatosTdoPeso [ , c(3,2,1,7,6,5,4)]
names (DatosTdoPeso1)
## [1] "Tratamiento" "Variedad"    "Parcela"     "Peso40"      "Peso41a45"  
## [6] "Peso46a60"   "PesoMas61"

Opción 2 Utilizar la función subset() - Ya hablamos de este comando en el vídeo “Filtrar datos II”

DatosTdoPeso2 = subset (DatosTdoPeso, select=c(3,2,1,7,6,5,4))
names (DatosTdoPeso2)
## [1] "Tratamiento" "Variedad"    "Parcela"     "Peso40"      "Peso41a45"  
## [6] "Peso46a60"   "PesoMas61"

Opción 3 Utilizar la función del paquete dplyr - Ya hablamos de este comando en el vídeo “Filtrar datos III”

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
DatosTdoPeso3 = DatosTdoPeso %>% select(Tratamiento, Variedad, Parcela, Peso40, Peso41a45, Peso46a60, PesoMas61)
names (DatosTdoPeso3)
## [1] "Tratamiento" "Variedad"    "Parcela"     "Peso40"      "Peso41a45"  
## [6] "Peso46a60"   "PesoMas61"

Opción 4 Utilizamos el orden de las variables o columnas del Data Frame referencia, para ordenar el DF objetivo.

DatosTdoPeso4 = DatosTdoPeso [ , c(names(DatosTesPeso))]
names (DatosTdoPeso4)
## [1] "Tratamiento" "Variedad"    "Parcela"     "Peso40"      "Peso41a45"  
## [6] "Peso46a60"   "PesoMas61"

Si en vez de ordenar las columnas, según el orden establecido en otro DF, queremos hacerlo en orden alfabético.

DatosTdoPesoAZ = DatosTdoPeso [ , order(c(names(DatosTdoPeso)))]
names (DatosTdoPesoAZ)
## [1] "Parcela"     "Peso40"      "Peso41a45"   "Peso46a60"   "PesoMas61"  
## [6] "Tratamiento" "Variedad"

En orden alfabético inverso.

DatosTdoPesoZA = DatosTdoPeso [ , rev(order(c(names(DatosTdoPeso))))]
names (DatosTdoPesoZA)
## [1] "Variedad"    "Tratamiento" "PesoMas61"   "Peso46a60"   "Peso41a45"  
## [6] "Peso40"      "Parcela"