Сортування кадру даних 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

В аналізі даних ви можете сортувати ваші дані відповідно до певної змінної в наборі даних. У R ми можемо скористатися допомогою функції order(). У R ми можемо легко відсортувати вектор безперервної змінної або факторної змінної. Упорядкування даних може бути висхідний or спускається порядку.

Синтаксис:

sort(x, decreasing = FALSE, na.last = NA)

Аргумент:

  • xВектор, що містить неперервну або факторну змінну
  • зменшується: Керує напрямком сортування. За замовчуванням для зменшення встановлено значення FALSE, що забезпечує порядок зростання.
  • на.останній: Вказує, чи значення NA слід розміщувати останніми чи ні. sort() використовує NA за замовчуванням, що пропускає відсутні значення; order() використовує TRUE, що зберігає їх і розміщує останніми.

sort() проти order() проти rank() в R

Синтаксис вище належить до sort(), проте кожен приклад на цій сторінці викликає order(). Ці дві функції відповідають на різні запитання, і їх змішування є найпоширенішою причиною невдачі сортування. rank() завершує тріо.

функція Повернення Використовуйте його, коли Обробка 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, показаного далі.

Сортування фрейму даних за допомогою dplyr 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

Стовпці символів. Звичайний текст сортується за локалізацією, тому використання великих літер та наголосів може змінити результат між машинами. Дві звички дозволяють уникнути несподіванок: перевіряти class(df$col) перед сортуванням та конвертувати цифри, що зберігаються як текст, за допомогою as.numeric(), щоб «10» не опинилося вище за «2».

Поширені запитання

Використовуйте df[order(rownames(df)), ]. Назви рядків є символьними, тому сортування виконується після текстового сортування, а «10» розміщується перед «2». Оберніть їх у as.numeric(), якщо вони числові. Tibbles повністю пропускають назви рядків, тому натомість додайте явний стовпець ідентифікатора.

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

Індексація зі зворотною послідовністю: df[nrow(df):1, ]. Це змінює поточний порядок замість сортування, що має значення, коли кадр був перетасований або згрупований. Після цього скиньте мітки за допомогою rownames(df) <- NULL, якщо вони виглядають заплутаними.

Стовпець зберігається як символ або коефіцієнт, тому R порівнює його з текстом і ставить «10» перед «2». Перевірте за допомогою class(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), який змінює порядок та підмножини за один крок.

Підсумуйте цей пост за допомогою: