Функция сортировки фрейма данных R: order() с примером.
⚡ Умное резюме
Сортировка фрейма данных в R основана на функции order(), которая возвращает позиции строк, а не значения. Передача этих позиций в квадратные скобки изменяет порядок строк: по одному столбцу, по нескольким столбцам или в порядке убывания.

Сортировка данных в R
При анализе данных вы можете sort ваши данные в соответствии с определенной переменной в наборе данных. В R мы можем использовать функцию order(). В R мы можем легко отсортировать вектор непрерывной переменной или факторной переменной. Организация данных может быть восходящий or нисходящий порядка.
Синтаксис:
sort(x, decreasing = FALSE, na.last = NA)
Аргумент:
- xВектор, содержащий непрерывную переменную или факторную переменную.
- убывающий: Управляет направлением сортировки. По умолчанию параметр decreasing установлен на FALSE, что обеспечивает сортировку по возрастанию.
- на.последний: Указывает, следует ли помещать значения NA в конец списка. Функция sort() по умолчанию использует NA, что приводит к удалению пропущенных значений; функция order() использует TRUE, что сохраняет их и помещает в конец списка.
функции sort(), order() и rank() в R
Приведённый выше синтаксис относится к функции sort(), однако во всех примерах на этой странице вызывается order(). Эти две функции отвечают на разные вопросы, и их путаница является наиболее распространённой причиной сбоя сортировки. Функция rank() завершает трио.
| Функция | Returns | Используйте это, когда | Обработка по умолчанию NA |
|---|---|---|---|
| Сортировать() | Сами ценности, в порядке убывания | Вам нужен только отсортированный вектор. | na.last = NA, поэтому NA отбрасывается |
| заказ() | Позиции в строках, обеспечивающие отсортированный порядок. | Вам необходимо изменить порядок элементов во всем фрейме данных. | na.last = TRUE, поэтому NA идет последним. |
| классифицировать() | Ранг каждого элемента в его исходном положении. | Вам нужен столбец для ранжирования, а не переупорядоченная таблица. | na.last = TRUE |
Поскольку функция order() возвращает позиции, это единственная из трех функций, которая может управлять подмножеством данных в квадратных скобках, используемым на этой странице. Базовая документация R для функции order() Перечисляет все аргументы, включая аргумент метода, который выбирает алгоритм сортировки.
Пример 1: Сортировка фрейма данных по одному столбцу.
Например, мы можем создать фрейм данных типа tibble и отсортировать одну или несколько переменных. Фрейм данных типа tibble — это современный подход к фрейм данныхЭто улучшает синтаксис фрейма данных и позволяет избежать утомительного форматирования типов данных, особенно преобразования символьных данных в факторы. Это также удобный способ создания фрейма данных вручную, что и является нашей целью здесь. Чтобы узнать больше о tibble, обратитесь к руководству: https://tibble.tidyverse.org/articles/tibble.html
Приведённый ниже код создаёт таблицу из 50 строк, состоящую из пяти случайных столбцов, а затем сортирует каждую строку по значениям в ячейке c1. Функция set.seed(1234) исправляет случайную выборку, поэтому на любой машине отображаются одни и те же числа.
library(dplyr) set.seed(1234) data_frame <- tibble( c1 = rnorm(50, 5, 1.5), c2 = rnorm(50, 5, 1.5), c3 = rnorm(50, 5, 1.5), c4 = rnorm(50, 5, 1.5), c5 = rnorm(50, 5, 1.5) ) # Sort by c1 df <-data_frame[order(data_frame$c1),] head(df)
Выход:
# A tibble: 6 x 5 ## c1 c2 c3 c4 c5 ## <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 1.481453 3.477557 4.246283 3.686611 6.0511003 ## 2 1.729941 5.824996 4.525823 6.753663 0.1502718 ## 3 2.556360 6.275348 2.524849 6.368483 5.4787404 ## 4 2.827693 4.769902 5.120089 3.743626 4.0103449 ## 5 2.988510 4.395902 2.077631 4.236894 4.6176880 ## 6 3.122021 6.317305 5.413840 3.551145 5.6067027
Запятая перед закрывающей скобкой имеет значение: df[order(…), ] переупорядочивает строки, тогда как df[, order(…)] переупорядочивает столбцы.
Пример 2: Сортировка по нескольким столбцам
Каждый дополнительный аргумент, передаваемый в функцию order(), выступает в качестве критерия разрешения конфликтов для предыдущего аргумента. В данном случае фрейм сортируется по значению c3, а строки с одинаковым значением c3 затем упорядочиваются по значению c4.
# Sort by c3 and c4
df <-data_frame[order(data_frame$c3, data_frame$c4),]
head(df)
Выход:
# A tibble: 6 x 5 ## c1 c2 c3 c4 c5 ## <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 2.988510 4.395902 2.077631 4.236894 4.617688 ## 2 2.556360 6.275348 2.524849 6.368483 5.478740 ## 3 3.464516 3.914627 2.730068 9.565649 6.016123 ## 4 4.233486 3.292088 3.133568 7.517309 4.772395 ## 5 3.935840 2.941547 3.242078 6.464048 3.599745 ## 6 3.835619 4.947859 3.335349 4.378370 7.240240
Пример 3: Отсортируйте один столбец по убыванию, а другой — по возрастанию.
Каждый столбец может иметь свое собственное направление сортировки. Добавление знака минус к числовому столбцу меняет направление сортировки только для этого столбца, поэтому сортировка ниже выполняется по убыванию по столбцу c3 и по возрастанию по столбцу c4.
# Sort by c3(descending) and c4(ascending)
df <-data_frame[order(-data_frame$c3, data_frame$c4),]
head(df)
Выход:
# A tibble: 6 x 5 ## c1 c2 c3 c4 c5 ## <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 4.339178 4.450214 8.087243 4.5010140 8.410225 ## 2 3.959420 8.105406 7.736312 7.1168936 5.431565 ## 3 3.339023 3.298088 7.494285 5.9303153 7.035912 ## 4 3.397036 5.382794 7.092722 0.7163620 5.620098 ## 5 6.653446 4.733315 6.520536 0.9016707 4.513410 ## 6 4.558559 4.712609 6.380086 6.0562703 5.044277
Приём со знаком минус работает только с числовыми столбцами. Для символьных или факторных столбцов используйте order(xtfrm(df$col), decreasing = TRUE), или переключитесь на подход с использованием dplyr, показанный далее.
Сортировка DataFrame с помощью функции arrange() из библиотеки dplyr.
Использование квадратных скобок затрудняет чтение, когда речь идёт о нескольких столбцах и направлениях, поскольку имя фрейма повторяется внутри каждого аргумента. дплир Функция arrange() устраняет это повторение: столбцы именуются один раз, а функция desc() помечает те, которые идут в обратном порядке.
library(dplyr) # The same three sorts written with arrange() data_frame %>% arrange(c1) # Example 1 data_frame %>% arrange(c3, c4) # Example 2 data_frame %>% arrange(desc(c3), c4) # Example 3
Стоит знать о трёх практических различиях:
- читабельностьФункция arrange(desc(c3), c4) напрямую выражает намерение, в то время как order(-data_frame$c3, data_frame$c4) скрывает его за знаком минус.
- Типы столбцовФункция desc() работает как с символьными и факторными столбцами, так и с числовыми, поэтому обходной путь с использованием xtfrm() не требуется.
- Недостающие значенияФункция arrange() всегда размещает элементы NA последними, независимо от направления, тогда как order() позволяет перемещать их с помощью na.last.
Функция arrange() возвращает новый фрейм данных, оставляя исходный фрейм без изменений, точно так же, как и в версии с квадратными скобками, поэтому результату все равно необходимо присвоить имя, которое будет сохранено. Сгруппированные фреймы сортируются внутри каждой группы только в том случае, если указано .by_group = TRUE.
Сортировка символьных, факторных и пропущенных значений в R.
Сортировка числовых столбцов происходит предсказуемо. Сортировка текстовых столбцов, категорий и пробелов — нет, и для каждого из этих трех типов столбцов требуется отдельное решение.
Отсутствующие значения. Функции sort() и order() расходятся во мнениях относительно того, что делать с значениями NA, поэтому в одном и том же столбце может отображаться разное количество строк:
x <- c(3, NA, 1, 2) sort(x) # missing values dropped sort(x, na.last = TRUE) # missing values pushed to the end order(x) # NA indexed last by default order(x, na.last = FALSE) # NA indexed first
факторы. A фактор Сортировка происходит по порядку уровней, а не по алфавиту. Это именно то, что нужно для упорядоченных категорий, таких как низкий, средний и высокий, и именно то, чего не нужно, если уровни созданы в том порядке, в котором значения случайно появились:
grades <- factor(c("low", "high", "medium"), levels = c("low", "medium", "high")) sort(grades) # follows the level order sort(as.character(grades)) # plain alphabetical order
Символьные столбцы. Сортировка обычного текста осуществляется по языковым параметрам, поэтому регистр букв и диакритические знаки могут влиять на результат на разных машинах. Чтобы избежать неожиданностей, следует придерживаться двух правил: проверять значение класса (df$col) перед сортировкой и преобразовывать цифры, хранящиеся в текстовом виде, с помощью метода as.numeric(), чтобы «10» не оказывалось впереди «2».
