Упорядочение столбца фрейма данных по группам в разных направлениях

#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