Сортировка по пользовательской функции в R

В питоне я могу сделать что-то вроде

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)

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
67
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Другие вопросы по теме