В питоне я могу сделать что-то вроде
a = [1,100,5,-5,-7,99,-100]
a.sort(key= lambda x: (x<0,abs(x)))
Это дает мне
[1, 5, 99, 100, -5, -7, -100]
Он отсортирован по положительному/отрицательному числу и значению абс.
Как я могу сделать то же самое в R? Без разделения на положительные и отрицательные числа?
a = c(1,100,5,-5,-7,99,-100)
order
берет на себя функцию лямбда-ключа сортировки
a[order(a<0, abs(a))]
Используйте функцию order()
:
a = c(1,100,5,-5,-7,99,-100)
a[order(a < 0, abs(a))]
#> [1] 1 5 99 100 -5 -7 -100
Created on 2022-03-22 by the reprex package (v2.0.1)
Другая возможность, полезная в некоторых ситуациях, — определить метод xtfrm
для класса. Например, если вы знаете, что все значения меньше 1000, вы можете использовать
class(a) <- "classa"
xtfrm.classa <- function(x) {
(a < 0) + abs(a)/1000
}
sort(a)
#> [1] 1 5 99 100 -5 -7 -100
Created on 2022-03-22 by the reprex package (v2.0.1)
Как насчет использования фактора с уровнями?
a <- c(1, 100, 5, -5, -7, 99, -100)
res <- factor(x = a, levels = unique(a[order(abs(a))]), ordered = TRUE)
res
# [1] 1 100 5 -5 -7 99 -100
# Levels: 1 < 5 < -5 < -7 < 99 < 100 < -100
Желаемый порядок сортировки
unique(a[order(abs(a))])
# [1] 1 5 -5 -7 99 100 -100