0Pricing
R Academy · Lekcja

order() do elastycznego sortowania

Uzyskuj permutację indeksów do sortowania według jednego lub wielu kryteriów.

order() do elastycznego sortowania to bezpłatna lekcja R Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.

Co zwraca order()

order() nie zwraca posortowanych wartości — zwraca indeksy, według których można posortować wektor. Taka pośrednia reprezentacja sprawia, że funkcja jest znacznie bardziej uniwersalna niż sort(), ponieważ indeksy można zastosować do dowolnej powiązanej struktury.

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

order() w kolejności malejącej

Podobnie jak sort(), funkcja order() przyjmuje argument decreasing = TRUE, aby zwrócić indeksy tworzące sekwencję malejącą. Jest to przydatne przy sortowaniu od największej do najmniejszej wartości.

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')

Sortowanie ramki danych według jednej kolumny

Najbardziej praktycznym zastosowaniem funkcji order() jest sortowanie ramki danych według jednej z jej kolumn. Należy przekazać kolumnę do order(), a następnie użyć zwróconych indeksów do zmiany kolejności wszystkich wierszy ramki danych.

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

Sortowanie ramki danych malejąco

Aby posortować ramkę danych od największej do najmniejszej wartości według kolumny liczbowej, należy przekazać decreasing = TRUE do order(). Nazwy wierszy (indeksy) w wyniku odzwierciedlają ich oryginalne pozycje.

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), ]

Sortowanie według wielu kolumn

Do funkcji order() należy przekazać wiele wektorów, oddzielając je przecinkami. R sortuje według pierwszego argumentu, a następnie rozstrzyga remisy za pomocą drugiego, trzeciego itd. Działa to podobnie jak klauzula ORDER BY w języku 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), ]

Mieszane sortowanie rosnące i malejące

Aby posortować jedną kolumnę rosnąco, a drugą malejąco, należy zanegować malejącą kolumnę liczbową za pomocą -. W przypadku kolumn tekstowych należy użyć xtfrm(), aby uzyskać sortowalną reprezentację całkowitą, a następnie ją zanegować.

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), ]

Obsługa NA w order()

Funkcja order() ma również argument na.last, podobnie jak sort(). Domyślnie na.last = NA, co umieszcza wartości NA na końcu. Ustawienie na.last = TRUE lub na.last = FALSE pozwala jawnie określić ich położenie.

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

Zachowywanie nazw wierszy po sortowaniu

Gdy podzbiór ramki danych jest wybierany za pomocą indeksów wierszy, R zachowuje oryginalne nazwy wierszy. Aby po sortowaniu zresetować je do wartości 1, 2, 3, ..., należy użyć row.names(df) <- NULL lub podejścia z reset=.

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() a sort() — porównanie

Najważniejsza różnica: sort(x) zwraca posortowane wartości, a order(x) — posortowane pozycje. Należy użyć sort(), gdy potrzebne są tylko wartości, oraz order(), gdy trzeba jednocześnie zmienić kolejność powiązanych struktur danych.

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')

Sortowanie ramki danych według kolumny tekstowej

Można również sortować według kolumn tekstowych. order(df$name) zwraca indeksy wierszy w alfabetycznej kolejności kolumny name, których następnie używa się do zmiany kolejności wierszy ramki danych.

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

Łączenie order() w złożonych sortowaniach

Sortowanie trzypoziomowe jest proste: należy przekazać trzy wektory do order(). Każdy kolejny argument służy jako kryterium rozstrzygające remis między równymi wartościami z poprzednich argumentów.

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), ]

Szybki test

Co zwraca order(x), gdy zostanie zastosowane do wektora x?

Najważniejsze informacje o order()

Najważniejsze informacje o order():

  • order(x) zwraca indeksy, a nie wartości — aby uzyskać posortowane wartości, należy użyć x[order(x)]
  • Ramki danych sortuje się za pomocą df[order(df$col), ]
  • Sortowanie według wielu kolumn: order(df$a, df$b) — remisy w a są rozstrzygane za pomocą b
  • Kolumny liczbowe należy zanegować za pomocą -, aby sortować malejąco w sortowaniu wielokolumnowym
  • Położenie wartości NA kontroluje argument na.last = TRUE/FALSE/NA
  • W przeciwieństwie do sort(), order() umożliwia jednoczesne sortowanie struktur równoległych
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), ]

Często zadawane pytania

Czy lekcja „order() do elastycznego sortowania” jest bezpłatna?

Tak — pełny tekst „order() do elastycznego sortowania” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „order() do elastycznego sortowania”?

Uzyskuj permutację indeksów do sortowania według jednego lub wielu kryteriów. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć R Academy?

Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „order() do elastycznego sortowania”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?

Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Sortowanie wektorów za pomocą sort()
  2. order() do elastycznego sortowania
  3. Ranking wartości za pomocą rank()
  4. Sortowanie ramek danych według kolumny
← Powrót do R Academy