#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)