R Academy · Lekcja

Ranking wartości za pomocą rank()

Przypisuj rangi, korzystając z metod rozstrzygania remisów: average, first, min, max i random.

Lekcja 3 z 413 kroki

Ranking wartości za pomocą rank() to bezpłatna lekcja R Academy na CoddyKit. To lekcja 3 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 rank()

rank(x) zwraca rangi obserwacji dla wartości w wektorze. Najmniejsza wartość otrzymuje rangę 1, druga najmniejsza — rangę 2 itd. W przeciwieństwie do order() wynik ma taką samą długość jak dane wejściowe, a każda pozycja zawiera swoją rangę.

scores <- c(78, 92, 65, 88, 71)
ranks <- rank(scores)
print(scores)
print(ranks)

Obsługa remisów: metoda average

Gdy wartości są równe (występuje remis), funkcja rank() używa argumentu ties.method, aby określić sposób przypisania rang. Domyślną metodą jest 'average': elementy z remisem otrzymują średnią rang, które zajęłyby bez remisu.

x <- c(10, 20, 20, 30)
# Default: average of positions 2 and 3 = 2.5
rank(x)
rank(x, ties.method = 'average')

Metoda remisów: first i last

ties.method = 'first' przypisuje niższą rangę temu z remisujących elementów, który pojawia się wcześniej w wektorze. 'last' działa odwrotnie — wcześniejszy element otrzymuje wyższą rangę.

x <- c(10, 20, 20, 30)
cat('first:', rank(x, ties.method = 'first'), '\n')
cat('last: ', rank(x, ties.method = 'last'),  '\n')

Metoda remisów: min i max

'min' przypisuje wszystkim remisującym elementom najniższą możliwą rangę (jest to stosowane w sporcie: dwóch zawodników zajmujących ex aequo 3. miejsce otrzymuje rangę 3, a nikt nie otrzymuje rangi 4). 'max' przypisuje wszystkim remisującym elementom najwyższą możliwą rangę.

x <- c(10, 20, 20, 30)
cat('min:', rank(x, ties.method = 'min'), '\n')
cat('max:', rank(x, ties.method = 'max'), '\n')

Metoda remisów: random

ties.method = 'random' rozstrzyga remisy, losowo przypisując różne rangi remisującym elementom. Każde wywołanie może dać inny wynik. Metoda jest przydatna, gdy potrzebne są unikatowe rangi całkowite, ale kolejność rozstrzygania remisów nie ma znaczenia.

x <- c(10, 20, 20, 20, 30)
set.seed(42)
cat('random run 1:', rank(x, ties.method = 'random'), '\n')
set.seed(99)
cat('random run 2:', rank(x, ties.method = 'random'), '\n')

Rangi gęste a standardowe

Funkcja rank() w R tworzy standardowy ranking zawodów (1, 2, 2, 4). Aby uzyskać ranking gęsty (1, 2, 2, 3 — bez luk), należy użyć rank(x, ties.method = 'min') dla unikatowych wartości albo skorzystać z pakietu data.table lub dplyr. Oto rozwiązanie w bazowym R:

x <- c(10, 20, 20, 30)
# Standard ranking (gaps after ties)
cat('Standard:', rank(x, ties.method = 'min'), '\n')
# Dense ranking: rank of sorted unique values
dense <- match(x, sort(unique(x)))
cat('Dense:   ', dense, '\n')

rank() a order() a sort()

Te trzy funkcje są ze sobą powiązane, ale zwracają różne wartości: sort(x) zwraca posortowane wartości, order(x) zwraca pozycje, według których sortowany jest wektor, a rank(x) zwraca rangę każdej pozycji. Poniżej przedstawiono porównanie obok siebie.

x <- c(30, 10, 50, 20, 40)
cat('x       :', x,        '\n')
cat('sort(x) :', sort(x),  '\n')
cat('order(x):', order(x), '\n')
cat('rank(x) :', rank(x),  '\n')

Ranking w kolejności malejącej

Aby utworzyć ranking od największej wartości do najmniejszej (ranga 1 = najwyższa wartość), należy zanegować wektor przed przekazaniem go do rank(). Jest to schemat stosowany w tabelach wyników, w których ranga 1 oznacza najlepszy wynik.

scores <- c(78, 92, 65, 88, 71)
desc_ranks <- rank(-scores)
cat('Scores:      ', scores,     '\n')
cat('Rank (best=1):', desc_ranks, '\n')

Dodawanie rang do ramki danych

Częstym zadaniem jest dodanie kolumny rang do ramki danych. Należy użyć rank() z ties.method = 'min' oraz negacji dla kolejności malejącej, aby utworzyć prawidłową tabelę wyników.

df <- data.frame(
  player = c('Alice', 'Bob', 'Carol', 'Dave'),
  score  = c(250, 400, 250, 375)
)
df$rank <- rank(-df$score, ties.method = 'min')
df[order(df$rank), ]

rank() z wartościami NA

Funkcja rank() ma argument na.last, podobnie jak sort() i order(). Wartość domyślna to 'keep', która przypisuje rangę NA wartościom NA, a elementy inne niż NA szereguje między sobą.

x <- c(5, NA, 2, NA, 8, 1)
cat('na.last=keep:  ', rank(x, na.last = 'keep'), '\n')
cat('na.last=TRUE:  ', rank(x, na.last = TRUE),   '\n')
cat('na.last=FALSE: ', rank(x, na.last = FALSE),  '\n')

Rangi percentylowe

Rangi można przekształcić na percentyle, dzieląc je przez łączną liczbę elementów. Ranga percentylowa informuje, jaka część wartości jest mniejsza lub równa danemu elementowi. Jest to przydatne w statystyce i ocenianiu wyników edukacyjnych.

scores <- c(60, 75, 82, 91, 68, 77, 85, 95)
n <- length(scores)
pct_rank <- rank(scores) / n * 100
result <- data.frame(score = scores, percentile = round(pct_rank, 1))
result[order(result$score), ]

Szybkie sprawdzenie

Która wartość ties.method nadaje wszystkim elementom o tej samej wartości tę samą najniższą możliwą rangę (tak jak w sporcie, gdzie dwóch zawodników dzieli 3. miejsce i nikt nie zajmuje 4. miejsca)?

Najważniejsze informacje o rank()

Najważniejsze informacje o rank():

  • rank(x) zwraca rangę każdego elementu (długość wyniku jest taka sama jak długość danych wejściowych)
  • Domyślne ties.method = 'average': elementy o tej samej wartości otrzymują średnią swoich rang
  • 'min' = styl sportowy (wspólna najniższa ranga), 'max' = wspólna najwyższa ranga
  • 'first' i 'last' rozstrzygają remisy według kolejności występowania
  • Należy użyć rank(-x) dla rang w kolejności malejącej (ranga 1 = największa wartość)
  • Kolumny rang w ramkach danych można dodawać za pomocą df$rank <- rank(-df$score, ties.method='min')
x <- c(10, 30, 20, 30, 10)
cat('average:', rank(x, ties.method = 'average'), '\n')
cat('min:    ', rank(x, ties.method = 'min'),     '\n')
cat('max:    ', rank(x, ties.method = 'max'),     '\n')
cat('first:  ', rank(x, ties.method = 'first'),   '\n')
Bezpłatny start

Ucz się R dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
43
Lekcje
159

Często zadawane pytania

Czy lekcja „Ranking wartości za pomocą rank()” jest bezpłatna?

Tak — pełny tekst „Ranking wartości za pomocą rank()” 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 „Ranking wartości za pomocą rank()”?

Przypisuj rangi, korzystając z metod rozstrzygania remisów: average, first, min, max i random. Ć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 3 z 4.

Ile czasu zajmuje lekcja „Ranking wartości za pomocą rank()”?

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