Cómo reordenar columnas data.table (sin copiar)

Me gustaría reordenar columnas en mi data.table x , dado un vector de caracteres de nombres de columna, neworder :

 library(data.table) x <- data.table(a = 1:3, b = 3:1, c = runif(3)) neworder <- c("c", "b", "a") 

Obviamente yo podría hacer:

 x[ , neworder, with = FALSE] # or x[ , ..neworder] # cba # 1: 0.8476623 3 1 # 2: 0.4787768 2 2 # 3: 0.3570803 1 3 

pero eso requeriría copiar todo el conjunto de datos nuevamente. Hay otra manera de hacer esto?

Use setcolorder() :

 library(data.table) x <- data.table(a = 1:3, b = 3:1, c = runif(3)) x # abc # [1,] 1 3 0.2880365 # [2,] 2 2 0.7785115 # [3,] 3 1 0.3297416 setcolorder(x, c("c", "b", "a")) x # cba # [1,] 0.2880365 3 1 # [2,] 0.7785115 2 2 # [3,] 0.3297416 1 3 

Desde ?setcolorder :

En lenguaje de datos, todas las funciones del set* cambian su entrada por referencia. Es decir, no se realiza ninguna copia, excepto la memoria de trabajo temporal, que es tan grande como una columna.

así que debería ser bastante eficiente. Ver ?setcolorder para más detalles.

Uno puede encontrar más fácil usar la solución anterior, pero en cambio ordenar por número de columna. Por ejemplo: library (data.table)

  > x <- data.table(a = 1:3, b = 3:1, c = runif(3)) > x abc [1,] 1 3 0.2880365 [2,] 2 2 0.7785115 [3,] 3 1 0.3297416 > setcolorder(x, c(3,2,1)) > x cba [1,] 0.2880365 3 1 [2,] 0.7785115 2 2 [3,] 0.3297416 1 3