Упорядочивание data.frame по нескольким переменным в смешанном направлении

Для этого образца data.frame,

df <- data.frame(var1=c("b","a","b","a","a","b"),
                 var2=c("l","l","k","k","l","k"),
                 var3=c("t","t","x","t","x","x"),
                 var4=c(5,3,3,5,5,3),
                 stringsAsFactors=F)

Несортированный

  var1 var2 var3 var4
1    b    l    t    5
2    a    l    t    3
3    b    k    x    3
4    a    k    t    5
5    a    l    x    5
6    b    k    x    3

Я хотел бы отсортировать по трем столбцам «var2», «var3» и «var4» в этом порядке одновременно. Один столбец по возрастанию и два по убыванию. Имена столбцов для сортировки хранятся в переменных.

sort_asc <- "var2"
sort_desc <- c("var3","var4")

Как лучше всего это сделать в база R?

Обновленные детали

Это результат сортировки сначала по возрастанию по 'var2' (шаг 1), а затем по убыванию по 'var3' и 'var4' (как шаг 2).

var1   var2 var3 var4
a      l    x    5
b      k    x    3
b      k    x    3
a      k    t    5
b      l    t    5
a      l    t    3

Но то, что я ищу, выполняет все три сортировки одновременно, чтобы получить это:

var1 var2 var3 var4
b    k    x    3
b    k    x    3
a    k    t    5
a    l    x    5
b    l    t    5
a    l    t    3

'var2' возрастает (k, l), внутри k и внутри l, 'var3' убывает, и аналогично 'var4' убывает

Чтобы прояснить, чем этот вопрос отличается от других вопросов по упорядочиванию data.frame ...

  • заказ по нескольким столбцам
  • имена столбцов для заказа хранятся в переменных
  • разные направления заказа (по возрастанию, по убыванию)
  • упорядочение осуществляется не поэтапно (одна сортировка за другой), а одновременно (все выбранные столбцы одновременно)
  • используя базу R, а не dplyr

Также имеет значение порядок переменных, по которым вы хотите упорядочить. Например, вы хотите упорядочить по возрастанию переменных до, а затем по убыванию? Посмотрите также на аргумент decreasing для order, который может быть вектором.

nicola 01.05.2018 14:44

@nicole Я хочу использовать все переменные одновременно. Не один за другим.

rmf 01.05.2018 14:45

В этом нет смысла. Когда вы упорядочиваете по двум переменным, строки упорядочиваются по первой переменной, и, если значение первой переменной совпадает, то вторая переменная разрывает связи. Не существует «использовать все переменные одновременно».

nicola 01.05.2018 14:47

Нам нужно понять, как вы хотите, чтобы это выглядело, когда разные переменные будут строками в разном порядке - как вы хотите, чтобы вложение работало?

Elin 01.05.2018 14:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
6
1 276
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пошаговое упорядочение (сначала сортировка по возрастанию, а затем по убыванию).

раствор dplyr:

library(dplyr)
df %>% 
   arrange_at(sort_asc) %>%
   arrange_at(sort_desc, desc)

  var1 var2 var3 var4
1    a    l    x    5
2    b    k    x    3
3    b    k    x    3
4    a    k    t    5
5    b    l    t    5
6    a    l    t    3

раствор основания R:

С base R, если есть несколько столбцов (как правило), используйте order в do.call. Здесь мы сначала создаем индекс по возрастанию, затем сортируем его по убыванию со вторым набором столбцов ('sort_desc')

i1 <- do.call(order, df[sort_asc]) 
df1 <- df[i1,]
i2 <-  do.call(order, c(df1[sort_desc], list(decreasing = TRUE)))
df1[i2,]

  var1 var2 var3 var4
5    a    l    x    5
3    b    k    x    3
6    b    k    x    3
4    a    k    t    5
1    b    l    t    5
2    a    l    t    3

Одновременное / последовательное упорядочивание (все переменные порядка используются на одном этапе упорядочивания):

раствор dplyr:

df %>% 
   arrange_(.dots  = c(sort_asc, paste0("desc(", sort_desc, ")")))

#   var1 var2 var3 var4
#1    b    k    x    3
#2    b    k    x    3
#3    a    k    t    5
#4    a    l    x    5
#5    b    l    t    5
#6    a    l    t    3

раствор основания R:

С base R, если нам нужен аналогичный выход, как с arrange_

df[do.call(order, c(as.list(df[sort_asc]), lapply(df[sort_desc], 
               function(x) -xtfrm(x)))),]

#  var1 var2 var3 var4
#3    b    k    x    3
#6    b    k    x    3
#4    a    k    t    5
#5    a    l    x    5
#1    b    l    t    5
#2    a    l    t    3

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