Как указать метод сравнения / ключа для метода сортировки в R? - PullRequest
2 голосов
/ 14 сентября 2011

В Python вы можете использовать ключ = ..., чтобы указать ключ, используемый для сравнения элементов при сортировке.Есть ли подобный способ сделать это в R?

Ответы [ 3 ]

3 голосов
/ 14 сентября 2011

Позвольте мне дать превосходный ответ Ричи.

Если вы хотите получить порядок любой клавиши, 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 дает вам простой интерфейс для сортировки по нескольким клавишам одновременно.Это позволяет создавать самые сложные ключи сортировки.

2 голосов
/ 14 сентября 2011

Глядя на эти примеры сортировки ключей Python , кажется, что есть две вещи, для которых вам может понадобиться ключ в R.

Во-первых, применяя функцию к каждому элементу вектора, который нужно отсортировать.

x <- c("clementine", "APPLE", "Banana")

В R вы просто вкладываете вызовы функций.

Так, а не

sort(x, key = tolower)

вы бы просто написали

sort(tolower(x))

Другой случай - для сортировки фреймов данных по определенному столбцу.

dfr <- data.frame(x = c(1, 4, 2, 5, 3), y = letters[c(5, 2, 1, 4, 3)])

Вместо

sort(dfr, key = function(row) row[2])

вы бы написали

o <- with(dfr, order(y))
dfr[o,]
1 голос
/ 14 сентября 2011

Функция sort по умолчанию возвращает векторные элементы в порядке возрастания, но не учитывает никаких NA.Функция order возвращает числовой вектор с уникальными элементами, указывающими позиции элементов в порядке возрастания, оставляя в конце NA.Много раз пользователь выбирал функцию order для «сортировки» фреймов данных и векторов, потому что длины сохраняются.

 temp=sample(1:10, 15, replace=TRUE)
 temp[c(3,12)] <- NA
 sort(temp)
# [1]  2  3  3  4  6  7  7  7  8  9  9 10 10
 order(temp)
# [1] 15  2 14  4 13  7  8 10 11  1  6  5  9  3 12
 temp
# [1]  9  3 NA  4 10  9  7  7 10  7  8 NA  6  3  2
 temp[ order(temp) ]
# [1]  2  3  3  4  6  7  7  7  8  9  9 10 10 NA NA

Чтобы изменить числовой или алфавитный порядок сопоставления по умолчанию, можно обернуть функции вокруг аргумента внутри порядкаможет быть многоуровневой сортировкой, если передано несколько аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...