Полное руководство: как использовать sort(), order() и rank() в R


Люди часто путают три функции в 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