0Pricing
R Academy · Урок

order() для гибкой сортировки

Получайте перестановку индексов для сортировки по одному или нескольким критериям.

«order() для гибкой сортировки» — бесплатный урок R Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.

Что возвращает order()

order() возвращает не отсортированные значения, а индексы, которые позволили бы отсортировать вектор. Такое косвенное обращение делает функцию гораздо мощнее sort(), поскольку эти индексы можно применять к любой связанной структуре.

x <- c(30, 10, 50, 20, 40)
indices <- order(x)
print(indices)
# Verify: x[indices] gives sorted x
print(x[indices])

order() по убыванию

Как и sort(), order() принимает decreasing = TRUE, чтобы вернуть индексы, задающие последовательность по убыванию. Это удобно для сортировки от наибольшего значения к наименьшему.

scores <- c(78, 92, 65, 88, 71)
desc_order <- order(scores, decreasing = TRUE)
cat('Rank order (index):', desc_order, '\n')
cat('Scores high to low:', scores[desc_order], '\n')

Сортировка data frame по одному столбцу

Самое практичное применение order() — сортировка data frame по одному из его столбцов. Передайте столбец в order(), а затем используйте полученные индексы, чтобы изменить порядок всех строк data frame.

df <- data.frame(
  name = c('Charlie', 'Alice', 'Bob', 'Diana'),
  age  = c(35, 28, 42, 31)
)
sorted_df <- df[order(df$age), ]
print(sorted_df)

Сортировка data frame по убыванию

Чтобы отсортировать data frame от наибольшего значения к наименьшему по numeric-столбцу, передайте в order() аргумент decreasing = TRUE. Имена строк (индексы) в результате отражают исходные позиции.

products <- data.frame(
  item  = c('Pen', 'Notebook', 'Stapler', 'Tape'),
  price = c(1.5, 4.99, 7.25, 2.10)
)
products[order(products$price, decreasing = TRUE), ]

Сортировка по нескольким столбцам

Передайте в order() несколько векторов, разделив их запятыми. R сортирует по первому аргументу, а затем разрешает совпадения с помощью второго, третьего и последующих аргументов. Это соответствует поведению конструкции ORDER BY в SQL.

df <- data.frame(
  dept   = c('HR', 'IT', 'HR', 'IT', 'HR'),
  salary = c(50000, 70000, 60000, 65000, 55000)
)
# Sort by dept first, then by salary within dept
df[order(df$dept, df$salary), ]

Смешанная сортировка по возрастанию и убыванию

Чтобы отсортировать один столбец по возрастанию, а другой по убыванию, примените унарный минус - к numeric-столбцу, который нужно сортировать по убыванию. Для character-столбцов используйте xtfrm(), чтобы получить пригодное для сортировки integer-представление, а затем примените к нему минус.

df <- data.frame(
  dept   = c('HR', 'IT', 'HR', 'IT', 'HR'),
  salary = c(50000, 70000, 60000, 65000, 55000)
)
# dept ascending, salary descending
df[order(df$dept, -df$salary), ]

Обработка NA в order()

У order() также есть аргумент na.last, как и у sort(). По умолчанию используется na.last = NA, что помещает NA в конец. Установите na.last = TRUE или na.last = FALSE, чтобы явно управлять их положением.

vals <- c(5, NA, 2, NA, 8, 1)
# Default: NAs sorted last
order(vals)
# NAs first
order(vals, na.last = FALSE)

Сохранение имён строк после сортировки

При выборе подмножества data frame по индексам строк R сохраняет исходные имена строк. Используйте row.names(df) <- NULL или подходы с reset=, чтобы после сортировки сбросить их к значениям 1, 2, 3, ...

df <- data.frame(
  city = c('Paris', 'Tokyo', 'NYC'),
  pop  = c(2.1, 13.9, 8.3)
)
sorted <- df[order(df$pop), ]
print(sorted)
# Reset row names
row.names(sorted) <- NULL
print(sorted)

order() и sort(): сравнение

Главное различие: sort(x) возвращает отсортированные значения, а order(x) — отсортированные позиции. Используйте sort(), когда нужны только значения, и order(), когда нужно одновременно изменить порядок связанных структур данных.

x <- c(50, 20, 80, 10, 60)
cat('sort(x)  :', sort(x), '\n')
cat('order(x) :', order(x), '\n')
cat('x[order(x)]:', x[order(x)], '\n')

Сортировка data frame по строковому столбцу

Сортировать можно и по character-столбцам. order(df$name) возвращает индексы строк в алфавитном порядке значений столбца name; затем эти индексы используются для изменения порядка строк data frame.

employees <- data.frame(
  name   = c('Zara', 'Ahmed', 'Maria', 'Bruno'),
  tenure = c(3, 7, 2, 5)
)
employees[order(employees$name), ]

Цепочка вызовов order() для сложной сортировки

Трёхуровневая сортировка выполняется просто: передайте в order() три вектора. Каждый следующий аргумент используется для разрешения совпадений значений в предыдущих аргументах.

df <- data.frame(
  region = c('West', 'East', 'West', 'East', 'West'),
  dept   = c('HR', 'IT', 'HR', 'IT', 'IT'),
  score  = c(85, 90, 78, 88, 92)
)
df[order(df$region, df$dept, df$score), ]

Быстрая проверка

Что возвращает order(x) при применении к вектору x?

Основные выводы об order()

Основные выводы об order():

  • order(x) возвращает индексы, а не значения — используйте x[order(x)], чтобы получить отсортированные значения
  • Сортируйте data frame с помощью df[order(df$col), ]
  • Сортировка по нескольким столбцам: order(df$a, df$b) — совпадения в a разрешаются по b
  • Для сортировки по убыванию применяйте - к numeric-столбцам при сортировке по нескольким столбцам
  • Управляйте положением NA с помощью na.last = TRUE/FALSE/NA
  • В отличие от sort(), order() позволяет одновременно сортировать параллельные структуры
df <- data.frame(
  name  = c('Eve', 'Bob', 'Alice', 'Charlie'),
  score = c(88, 92, 88, 75)
)
# Sort by score descending, then name ascending for ties
df[order(-df$score, df$name), ]

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

Урок «order() для гибкой сортировки» бесплатный?

Да — полный текст урока «order() для гибкой сортировки» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.

Чему я научусь в уроке «order() для гибкой сортировки»?

Получайте перестановку индексов для сортировки по одному или нескольким критериям. Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать R Academy?

Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «order() для гибкой сортировки»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке R Academy?

Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Сортировка векторов с помощью sort()
  2. order() для гибкой сортировки
  3. Ранжирование значений с помощью rank()
  4. Сортировка таблиц данных по столбцу
← Назад к R Academy