Позвольте мне дать превосходный ответ Ричи.
Если вы хотите получить порядок любой клавиши, order
- это функция, на которую вы смотрите.Основываясь на примере Ричи:
id <- order(tolower(x))
x[id] # gives you the original ordered vector
Если вам нужны конкретные ключи, вы должны взглянуть на упорядоченные факторы.Допустим, вы хотите заказать наблюдения, следующие за серией маленький, больший, самый большой.
Мы создаем фрейм данных:
x <- data.frame(V1=1:10,
V2=sample(c("small","bigger","biggest"),10,TRUE)
)
Теперь вы можете заказать это, используя:
id <- order(ordered(x$V2,levels=c("small","bigger","biggest")))
x[id,]
функция ordered()
делает фактор x $ V2 упорядоченным фактором в соответствии с указанными вами уровнями.order()
дает вам порядок этого упорядоченного вектора.Этот порядок вы можете использовать для сортировки фрейма данных x
.
Если вы хотите отсортировать сначала в V2, а затем в V1, вы также можете задать несколько аргументов для порядка:
id <- order(ordered(x$V2,levels=c("small","bigger","biggest")),x$V1)
x[id,]
Относительно вашего вопроса: вам не нужны лямбда-выражения для этого, как показал Ричи.В x[order(tolower(x))]
вы фактически используете что-то эквивалентное sort(x, key=lambda x:tolower(x) )
.
Чтобы привести другой пример, скажем, у вас есть список векторов, и вы хотите отсортировать по второму значению.Вы бы использовали что-то вроде sort(x, key = lamda x:x[2] )
в Python, верно?В R вам нужно применить функцию к вашему списку и использовать ее в команде заказа:
x <- list(x1=1:10,x2=10:1,x3=rep(5,10))
id <- order(sapply(x,function(i)i[3]))
x[id]
Общий метод
В R вы создаетеключ и использовать порядок этого ключа в качестве индексов для исходного объекта.Функция order
дает вам простой интерфейс для сортировки по нескольким клавишам одновременно.Это позволяет создавать самые сложные ключи сортировки.