Как изменить порядок столбцов data.table (без копирования)

Я хотел бы изменить порядок столбцов в моей data.table x , заданный символьным вектором имен столбцов, neworder :

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

Очевидно, я мог бы сделать:

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

но это потребует повторного копирования всего набора данных. Есть ли другой способ сделать это?

Использовать 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 

От ?setcolorder :

В языке data.table все set* функции меняют свой вход по ссылке. То есть никакой копии не делается вообще, кроме временной рабочей памяти, которая равна одному столбцу.

поэтому должно быть довольно эффективно. Подробнее см. ?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(3,2,1)) > x cba [1,] 0.2880365 3 1 [2,] 0.7785115 2 2 [3,] 0.3297416 1 3 
  • Ошибка - замена имеет строки, данные имеют
  • Сделать фон графика разными цветами в разных регионах
  • Наложение двух графиков ggplot2 stat_density2d с альфа-каналами
  • Как объединить факторы, не превращая их в целые уровни?
  • R ggplot2 - Как указать цвет из значений границ?
  • Примеры случайных строк в области данных
  • Добавьте горизонтальную линию к сюжету и легенде в ggplot2
  • R и системные вызовы
  • Удалить часть строки
  • Заменить бары в geom_bar ggplot2
  • Формат даты-времени как сезонов в R?
  • Давайте будем гением компьютера.