Сортування кадру даних R: функція order() з прикладом
⚡ Розумний підсумок
Сортування фрейму даних у 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».

