Обратный порядок для данных.таблица `setkey()`

#r #data.table #reverse

#r #data.table #обратный

Вопрос:

Каков оптимальный путь к setkey data.table с обратным порядком записей? До сих пор я использую комбинацию setkey() и setorder() :

 setkeyrev <- function(inputDT,...){
  setkey(inputDT, ...)
  setorderv(inputDT, key(inputDT), order = -1)
  invisible(inputDT)
}
  

Есть ли лучшее решение?

UPD. вот пример:

 myDT <- fread('
colA colB
1 b1
3 b3
8 b8
5 b5')

setkey(myDT, colA)
myDT

setkeyrev(myDT, colA)
myDT
  

Комментарии:

1. Может setkeyv(dt, rev(key(dt))) быть?

2. Я имел в виду порядок записей, а не столбцов (это может быть только один столбец).

3. Вы имеете в виду установку ключей с сортировкой по убыванию?

4. да! Я добавлю пример, чтобы сделать его более понятным

5. О, кстати, конечный результат не имеет ключа (хотя, я думаю, вы это знаете) — он ломается при изменении порядка. Насколько я понимаю, ключи поддерживаются только тогда, когда данные находятся в порядке возрастания в памяти.

Ответ №1:

Я опоздал на 3 года, но это может помочь кому-то еще. Я искал решение именно этого вопроса, но, как отмечено в комментариях, пример в OP не сохраняет ключи. Комментарии заставили меня подумать о простом решении. Создайте новый столбец, задающий желаемый порядок (обратный ранг), затем используйте его в качестве ключа…

 myDT <- fread('
colA colB
1 b1
3 b3
8 b8
5 b5')

myDT[,revorder:=frankv(colA,order=-1,ties.method = "first")]
setkey(myDT,revorder)

  

Если вам нужен обратный порядок внутри групп (как я сделал)…

 myDT <- fread('
colA grp 
1 a
2 a
3 a
4 b
8 b
5 b')

myDT[,revorder:=frankv(colA,order=-1,ties.method = "first"),by = grp]
setkey(myDT,grp,revorder)