Для этого образца 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 ...
@nicole Я хочу использовать все переменные одновременно. Не один за другим.
В этом нет смысла. Когда вы упорядочиваете по двум переменным, строки упорядочиваются по первой переменной, и, если значение первой переменной совпадает, то вторая переменная разрывает связи. Не существует «использовать все переменные одновременно».
Нам нужно понять, как вы хотите, чтобы это выглядело, когда разные переменные будут строками в разном порядке - как вы хотите, чтобы вложение работало?
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
С 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
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
С 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
Также имеет значение порядок переменных, по которым вы хотите упорядочить. Например, вы хотите упорядочить по возрастанию переменных до, а затем по убыванию? Посмотрите также на аргумент
decreasing
дляorder
, который может быть вектором.