#r
Вопрос:
У меня есть пример фрейма данных:
dd <- data.frame(a = factor(c("Hi", "Hi", "Low", "Low"),
levels = c("Low", "Hi"), ordered = T),
b = c(1,2,3,4))
dd
# a b
# 1 Hi 1
# 2 Hi 2
# 3 Low 3
# 4 Low 4
Я хотел бы упорядочить столбец b в порядке возрастания, если в столбце a значение «Привет», и я хотел бы упорядочить столбец b по убыванию, если в столбце a значение «Низкий». Я был бы признателен за любую помощь!
Ответ №1:
Один из вариантов заключается в использовании desc
и rev
на основе значения «a»
library(dplyr)
dd %>%
arrange(match(a, c("Hi", "Low")),
case_when(a == "Low" ~ desc(b), TRUE ~ rev(desc(b))))
-выход
a b
1 Hi 1
2 Hi 2
3 Low 4
4 Low 3
Или другой вариант-преобразовать числовой столбец, изменив знак на основе значений в «a»
dd %>%
arrange(match(a, c("Hi", "Low")), b * c(1, -1)[1 (a == "Low")])
a b
1 Hi 1
2 Hi 2
3 Low 4
4 Low 3
Ответ №2:
Мы могли бы использовать dplyr::arrange
с ifelse
условием. Вместо использования desc
мы могли бы использовать базовую rev
функцию R:
library(dplyr)
dd %>%
arrange(a, ifelse(a == "Hi", b, rev(b))) %>%
arrange(rev(a))
выход:
a b
1 Hi 1
2 Hi 2
3 Low 4
4 Low 3
Ответ №3:
Базовый параметр R, умножьте b
на 1, если a имеет «Высокое» значение, иначе умножьте его на -1 и order
строки.
with(dd, dd[order(a, b * ifelse(a == 'Hi', 1, -1)), ])
# a b
#4 Low 4
#3 Low 3
#1 Hi 1
#2 Hi 2