Люди часто путают три функции в R: sort , order и rank .
Вот разница между этими функциями:
- sort() будет сортировать вектор в порядке возрастания
- order() вернет индекс каждого элемента в векторе в отсортированном порядке.
- rank() присваивает ранг каждому элементу вектора (наименьший = 1)
В следующем примере показано, как использовать каждую из этих функций на практике.
Пример: используйте sort(), order() и rank() с векторами
В следующем коде показано, как использовать функции sort() , order() и rank() с вектором с четырьмя значениями:
#create vector
x <- c(0, 20, 10, 15)
#sort vector
sort(x)
[1] 0 10 15 20
#order vector
order(x)
[1] 1 3 4 2
#rank vector
rank(x)
[1] 1 4 2 3
Вот что делала каждая функция:
1. Функция sort() просто сортирует значения в векторе в порядке возрастания.
2. Функция order() возвращает индекс каждого элемента в отсортированном порядке.
- Если вы упорядочите значения из исходного вектора на основе этих значений индекса, вы получите отсортированный вектор.
- Например, order() говорит нам сначала поместить значение в индексную позицию 1 — это 0 в исходном векторе.
- Затем order() говорит нам поместить значение в позицию индекса 3 следующей — это 10 в исходном векторе.
- Затем order() говорит нам поместить значение в позицию индекса 4 следующей — это 15 в исходном векторе.
- Затем order() говорит нам поместить значение в позицию индекса 2 следующей — это 20 в исходном векторе.
- Конечным результатом является отсортированный вектор — 0, 10, 15, 20.
3. Функция rank() присвоила ранг каждому элементу вектора, используя 1 для наименьшего значения.
- Например, rank() сообщает нам, что первое значение в исходном векторе является наименьшим (ранг = 1), а второе значение в исходном векторе является наибольшим (ранг = 4).
Обратите внимание, что мы можем использовать следующий синтаксис для использования sort() , order() и rank() в обратном порядке:
#create vector
x <- c(0, 20, 10, 15)
#sort vector in decreasing order
sort(x, decreasing= TRUE )
[1] 20 15 10 0
#order vector in decreasing order
order(x, decreasing= TRUE )
[1] 2 4 3 1
#rank vector in reverse order (largest value = 1)
rank(-x)
[1] 4 1 3 2
Обратите внимание, что эти результаты прямо противоположны результатам, полученным в предыдущих примерах.
Примечание. Как обрабатывать нити с помощью функции rank()
Мы можем использовать аргумент ties.method , чтобы указать, как мы должны обрабатывать ничьи при использовании функции rank() :
rank(x, ties. method ='average')
Вы можете использовать один из следующих параметров, чтобы указать, как обрабатывать связи:
- среднее : (по умолчанию) присваивает каждому связанному элементу средний ранг (элементы, занимающие 3-ю и 4-ю позицию, получат ранг 3,5).
- first : присваивает первому связанному элементу самый низкий ранг (элементы, занимающие 3-ю и 4-ю позиции, получат ранги 3 и 4 соответственно)
- min : присваивает каждому связанному элементу самый низкий ранг (элементы, занимающие 3-ю и 4-ю позицию, получат ранг 3).
- max : присваивает каждому связанному элементу наивысший ранг (элементы, занимающие 3-ю и 4-ю позицию, получат ранг 4)
- random : присваивает каждому связанному элементу случайный ранг (любой элемент, связанный с 3-й и 4-й позицией, может получить любой ранг)
В зависимости от вашего сценария один из этих методов может иметь больше смысла, чем другие.
Дополнительные ресурсы
В следующих руководствах объясняется, как выполнять другие распространенные операции в R:
Как сортировать по нескольким столбцам в R
Как отсортировать фрейм данных по дате в R
Как рассчитать процентильный ранг в R