Заменить строки в таблице данных в определенном порядке
У меня есть 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