Sortowanie ramek danych według kolumny
Sortuj całe ramki danych za pomocą order() i arrange() z pakietu dplyr.
Sortowanie ramek danych według kolumny to bezpłatna lekcja R Academy na CoddyKit. To lekcja 4 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.
Sortowanie ramki danych według jednej kolumny
Standardowym sposobem sortowania ramki danych w base R jest użycie order() dla wybranej kolumny i wykorzystanie otrzymanych indeksów do zmiany kolejności wierszy. Przecinek po indeksach wybiera wszystkie kolumny.
df <- data.frame(
name = c('Charlie', 'Alice', 'Bob', 'Diana'),
age = c(35, 28, 42, 31),
salary = c(55000, 48000, 72000, 61000)
)
df[order(df$age), ]Sortowanie malejące za pomocą negacji
W przypadku kolumn numerycznych należy zanegować kolumnę wewnątrz order(), aby odwrócić kierunek sortowania. Znak minus odwraca wszystkie wartości, dzięki czemu wartość, która była maksymalna, staje się najmniejsza z punktu widzenia sortowania.
df <- data.frame(
name = c('Charlie', 'Alice', 'Bob', 'Diana'),
salary = c(55000, 48000, 72000, 61000)
)
# Highest salary first
df[order(-df$salary), ]Sortowanie według wielu kolumn
Do order() można przekazać wiele kolumn, aby sortować najpierw według kryterium głównego, a następnie dodatkowego. Drugi argument rozstrzyga remisy w pierwszym. Odpowiada to klauzuli ORDER BY col1, col2 w SQL.
df <- data.frame(
dept = c('Eng', 'HR', 'Eng', 'HR', 'Eng'),
name = c('Zara', 'Bob', 'Alice', 'Eve', 'Mike'),
salary = c(90000, 55000, 85000, 58000, 78000)
)
# Sort by dept, then by salary descending within dept
df[order(df$dept, -df$salary), ]Sortowanie kolumn tekstowych
Sortowanie według kolumny tekstowej działa tak samo — order() obsługuje porządek leksykograficzny. Aby uzyskać kolejność alfabetyczną malejącą, należy użyć decreasing = TRUE zamiast negacji (negacja działa tylko dla wartości numerycznych).
df <- data.frame(
city = c('Paris', 'Athens', 'Berlin', 'London'),
pop_mil = c(2.1, 0.6, 3.6, 9.0)
)
# Alphabetical by city
df[order(df$city), ]
# Reverse alphabetical
df[order(df$city, decreasing = TRUE), ]Resetowanie numerów wierszy po sortowaniu
Po sortowaniu nazwy wierszy odzwierciedlają ich oryginalne pozycje (np. 3, 1, 4, 2). Aby zmienić je na kolejne liczby całkowite zaczynające się od 1, należy ustawić row.names(df) <- NULL lub opakować wynik w data.frame().
df <- data.frame(
x = c(30, 10, 20),
y = c('c', 'a', 'b')
)
sorted <- df[order(df$x), ]
cat('Before reset:\n'); print(sorted)
row.names(sorted) <- NULL
cat('After reset:\n'); print(sorted)Sortowanie z wartościami NA
Gdy kolumna używana do sortowania zawiera NA, funkcja order() domyślnie umieszcza je na końcu. Należy użyć na.last = FALSE, aby przenieść wiersze z NA na początek, albo najpierw je odfiltrować.
df <- data.frame(
name = c('Alice', 'Bob', 'Carol', 'Dave'),
score = c(85, NA, 92, NA)
)
cat('NAs last (default):\n')
print(df[order(df$score), ])
cat('NAs first:\n')
print(df[order(df$score, na.last = FALSE), ])dplyr::arrange() jako nowoczesna alternatywa
Pakiet dplyr udostępnia funkcję arrange() jako bardziej przejrzystą alternatywę. Chociaż dplyr nie należy do base R, znajomość tej składni pomaga w czytaniu współczesnego kodu R. Uwaga: isRunnable ma tutaj wartość true wyłącznie po to, aby pokazać składnię — pakiet dplyr musi być zainstalowany, aby można było ją uruchomić.
# dplyr::arrange() syntax (requires dplyr installed)
# library(dplyr)
# df |> arrange(salary) # ascending
# df |> arrange(desc(salary)) # descending
# df |> arrange(dept, desc(salary)) # multi-column
# Equivalent base R:
df <- data.frame(dept=c('A','B','A'), salary=c(50,70,60))
df[order(df$dept, -df$salary), ]Sortowanie faktorów według kolejności poziomów
Kolumny typu factor są sortowane według kolejności poziomów, a nie alfabetycznie. Umożliwia to zdefiniowanie niestandardowej kolejności sortowania przez jawne ustawienie poziomów faktora przed sortowaniem.
df <- data.frame(
priority = factor(c('Low', 'High', 'Medium', 'High', 'Low'),
levels = c('Low', 'Medium', 'High')),
task = c('T1', 'T2', 'T3', 'T4', 'T5')
)
# Sorts by factor level (Low < Medium < High)
df[order(df$priority), ]Sortowanie i wybieranie pierwszych wierszy
Często stosowany schemat polega na posortowaniu ramki danych, a następnie pobraniu pierwszych N wierszy za pomocą head() lub ostatnich N za pomocą tail(). Jest to odpowiednik ORDER BY ... LIMIT N z SQL w base R.
df <- data.frame(
product = c('A', 'B', 'C', 'D', 'E'),
revenue = c(1200, 4500, 890, 3100, 2750)
)
# Top 3 by revenue
top3 <- head(df[order(-df$revenue), ], 3)
row.names(top3) <- NULL
print(top3)Sortowanie w miejscu a sortowanie z przypisaniem
Sortowanie nie modyfikuje oryginalnej ramki danych — zwraca nową ramkę. Wynik należy zawsze przypisać do zmiennej (nowej albo tej samej, zastępując oryginał). Zastąpienie oryginału jest odpowiednie, gdy nie jest już potrzebna niesortowana wersja.
df <- data.frame(
x = c(3, 1, 4, 1, 5, 9),
y = c('c', 'a', 'd', 'b', 'e', 'i')
)
# Safe: assign to new variable
df_sorted <- df[order(df$x), ]
# Or overwrite original:
df <- df[order(df$x), ]
row.names(df) <- NULL
print(df)Kompletny przebieg sortowania
Poniżej przedstawiono kompletny, realistyczny przebieg sortowania ramki danych: sortowanie pracowników najpierw rosnąco według nazwy działu, a następnie malejąco według wynagrodzenia, resetowanie indeksów wierszy i przejrzyste wyświetlenie wyniku.
employees <- data.frame(
name = c('Alice', 'Bob', 'Carol', 'Dave', 'Eve'),
dept = c('IT', 'HR', 'IT', 'HR', 'IT'),
salary = c(85000, 58000, 92000, 63000, 78000)
)
result <- employees[order(employees$dept, -employees$salary), ]
row.names(result) <- NULL
print(result)Szybkie sprawdzenie
Jak posortować ramkę danych df według kolumny numerycznej df$salary w kolejności malejącej, używając base R?
Sortowanie ramek danych: najważniejsze informacje
Najważniejsze informacje o sortowaniu ramek danych:
- Idiom base R:
df[order(df$col), ] - Malejąco dla wartości numerycznych: użyć negacji
-wewnątrzorder(-df$col) - Malejąco dla tekstu: użyć argumentu
decreasing = TRUE - Wiele kolumn:
order(df$a, df$b)— sortowanie dodatkowe rozstrzyga remisy - Faktory są sortowane według zdefiniowanej kolejności poziomów, a nie alfabetycznie
- Po sortowaniu zresetować nazwy wierszy za pomocą
row.names(df) <- NULL - Nowoczesna alternatywa:
dplyr::arrange()zdesc()dla kolejności malejącej
df <- data.frame(
name = c('Zara', 'Ana', 'Bob', 'Ana'),
score = c(90, 85, 92, 88)
)
# Sort by name asc, score desc
result <- df[order(df$name, -df$score), ]
row.names(result) <- NULL
print(result)Często zadawane pytania
Czy lekcja „Sortowanie ramek danych według kolumny” jest bezpłatna?
Tak — pełny tekst „Sortowanie ramek danych według kolumny” 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 „Sortowanie ramek danych według kolumny”?
Sortuj całe ramki danych za pomocą order() i arrange() z pakietu dplyr. Ć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 4 z 4.
Ile czasu zajmuje lekcja „Sortowanie ramek danych według kolumny”?
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
- Sortowanie wektorów za pomocą sort()
- order() do elastycznego sortowania
- Ranking wartości za pomocą rank()
- Sortowanie ramek danych według kolumny