Заменить строки в таблице данных в определенном порядке

У меня есть data.table dumdt:

set.seed(123)
dumdt <- data.table(v1=sample(1:10, 5), v2=1:5)

чьи строки я хотел бы переупорядочить в этом конкретном порядке индексов (сначала первое третье, затем пятое, второе и т.д.):

to_ord <- c(3, 5, 2, 1, 4)

Поэтому я хотел бы, чтобы dumdt был результатом dumdt[to_ord], но я также хотел бы сделать это по ссылке и не делать dumdt <- dumdt[to_ord].

Я знаю, что могу упорядочить строки по ссылке setorder (или setorderv), но только по одной или нескольким переменным, в порядке возрастания или убывания, а не в индивидуальном порядке. Однако, если я хотел бы изменить порядок столбцов, а не строк, в индивидуальном порядке, я мог бы использовать setcolorder.

Итак, вот мой вопрос: есть ли функция, которая будет работать как setcolorder, но с строками (или способом использовать setorder, чтобы сделать то же самое)?

Мой желаемый результат будет чем-то вроде

setroworder(x=dumdt, neworder=to_ord)
dumdt
   # v1 v2
# 1:  4  3
# 2:  6  5
# 3:  8  2
# 4:  3  1
# 5:  7  4

Ответы

Ответ 1

Эта возможность еще не экспортирована. Посмотрев на источник setorderv, я смог извлечь требуемый вызов функции C, который делает то, что вам нужно, и поставьте его на заказ.

library(data.table)
set.seed(123)
dumdt <- data.table(v1=sample(1:10, 5), v2=1:5)
print(dumdt)
#   v1 v2
#1:  3  1
#2:  8  2
#3:  4  3
#4:  7  4
#5:  6  5
setroworder <- function(x, neworder) {
    .Call(data.table:::Creorder, x, as.integer(neworder), PACKAGE = "data.table")
    invisible(x)
}
to_ord <- c(3, 5, 2, 1, 4)
setroworder(x=dumdt, neworder=to_ord)
print(dumdt)
#   v1 v2
#1:  4  3
#2:  6  5
#3:  8  2
#4:  3  1
#5:  7  4

Однако решение, предложенное Фрэнком, выглядит немного лучше.

Ответ 2

Если я правильно понимаю, вы можете просто добавить col, а затем заказать его:

setorder(dumdt[, .r := order(to_ord)], .r)[, .r := NULL]

   v1 v2
1:  4  3
2:  6  5
3:  8  2
4:  3  1
5:  7  4