Функция сортировки фрейма данных R: order() с примером.

⚡ Умное резюме

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

  • 🔢 Основные принципы функции order(): Функция order() возвращает индексы строк, которые упорядочивают столбец по возрастанию, а не сами отсортированные значения.
  • 📌 Одна колонка: df[order(df$c1), ] переставляет каждую строку фрейма в соответствии со значениями, хранящимися в c1.
  • 🧮 Несколько столбцов: Дополнительные аргументы выступают в качестве критерия разрешения неоднозначностей, поэтому order(df$c3, df$c4) сортирует по c3, а затем по c4.
  • ???? В порядке убывания: Добавьте знак минус перед числовым столбцом или передайте параметр decreasing = TRUE в функцию sort().
  • 🧩 Маршрут tidyverse: Функции arrange() и desc() выражают точно такие же типы данных, как и читаемые глаголы dplyr.
  • ⚠️ Отсутствующие значения: Функция order() по умолчанию помещает значения NA в конец списка, в то время как функция sort() удаляет пропущенные значения, если не задан параметр na.last.

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».

Часто задаваемые вопросы (FAQ)

Используйте df[order(rownames(df)), ]. Названия строк являются символьными, поэтому сортировка выполняется в соответствии с текстовой кодировкой, и «10» оказывается перед «2». Если они числовые, оберните их в as.numeric(). Tibble полностью отбрасывает названия строк, поэтому добавьте вместо них явный столбец id.

Передайте метод `method = “radix”` в метод `order()` — это самый быстрый вариант для целых чисел и коротких строк. Для миллионов строк `data.table::setorder()` сортирует данные на месте без копирования таблицы, а метод `arrange()` в `dplyr` уже использует внутреннюю сортировку по разрядам.

Индекс с обратной последовательностью: df[nrow(df):1, ]. Это меняет текущий порядок вместо сортировки, что важно, если фрейм был перемешан или сгруппирован. После этого сбросьте метки с помощью rownames(df) <- NULL, если они выглядят непонятно.

Столбец хранится как символ или фактор, поэтому R сравнивает его как текст и ставит «10» перед «2». Проверьте с помощью класса (df$col), затем преобразуйте с помощью as.numeric(as.character(df$col)) перед упорядочиванием.

Нет. Функция order() возвращает вектор индексов, а df[order(…), ] создает новый фрейм, поэтому исходный фрейм остается неизменным до тех пор, пока результат не будет присвоен обратно. Имена строк сохраняют свои старые значения, что является полезным признаком того, что фрейм был переупорядочен.

Искусственный интеллект может обнаружить столбец, хранящийся как текст, если числовая сортировка выглядит неправильно, преобразовать базовый вызов функции order() в R в конвейер dplyr и предложить стабильный столбец для разрешения неоднозначностей. Всегда запускайте код и проверяйте head() перед тем, как доверять результату.

Да. Второй пилот GitHub Работает в RStudio Desktop 2023.09.0 и более поздних версиях и выполняет вызовы order() и arrange() из обычного комментария. Posit предупреждает, что предлагаемые варианты не являются детерминированными, поэтому перед запуском следует просмотреть каждую строку.

Изменяет порядок столбцов, а не строк. Функция `df[, order(names(df))]` упорядочивает столбцы по алфавиту, а `df[, c(“c3”, “c1”)]` выбирает заданный порядок. Пользователи `dplyr` могут вызвать `select(df, c3, c1)`, которая изменяет порядок и выбирает подмножества за один шаг.

Подведем итог этой публикации следующим образом: