Menu
Coddy logo textTech

Sortowanie według klucza

Część sekcji Logika i przepływ sterowania ścieżki R w Coddy. Lekcja 38 z 64.

order(x) zwraca pozycje, które posortowałyby x: najpierw pozycję najmniejszej wartości, potem kolejną i tak dalej. Użyj ich do indeksowania innego wektora, aby posortować go według x:

names <- c("cy", "ada", "bo")
ages <- c(41, 36, 22)
print(order(ages))
print(names[order(ages)])

Wynik:

[1] 3 2 1
[1] "bo"  "ada" "cy" 

Aby sortować w kolejności malejącej, przekaż decreasing = TRUE albo umieść znak minus przed kluczem numerycznym:

names <- c("cy", "ada", "bo")
scores <- c(80, 95, 80)
print(names[order(scores, decreasing = TRUE)])
print(names[order(-scores)])

Wynik:

[1] "ada" "cy"  "bo" 
[1] "ada" "cy"  "bo" 

Podaj funkcji order() drugi klucz, aby rozstrzygać remisy. Tutaj wyniki są sortowane od najwyższego do najniższego, a jednakowe wyniki — według imienia:

names <- c("cy", "ada", "bo")
scores <- c(80, 95, 80)
print(names[order(-scores, names)])

Wynik:

[1] "ada" "bo"  "cy" 

order() zachowuje pierwotną kolejność wartości o jednakowej wartości, gdy nie podano drugiego klucza. Te same pozycje mogą zmienić kolejność kilku powiązanych ze sobą wektorów:

items <- c("tea", "jam", "oil")
price <- c(4, 2.5, 4)
qty <- c(1, 6, 3)
idx <- order(price)
print(items[idx])
print(qty[idx])

Wynik:

[1] "jam" "tea" "oil"
[1] 6 1 3
challenge icon

Wyzwanie

Łatwy

Uzupełnij ranking(names, scores). Zwróć po jednej linii na gracza, 1. ada 95, od najwyższego wyniku do najniższego. Gracze z takim samym wynikiem są wymienieni alfabetycznie.

Dostarczony kod odczytuje graczy jako pary name:score oddzielone przecinkami i wyświetla każdą zwróconą linię.

Spróbuj swoich sił

ranking <- function(names, scores) {
  # Wpisz tutaj swój kod
  character(0)
}

# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
input <- suppressWarnings(readLines(file("stdin")))
pairs <- strsplit(strsplit(input[1], ",")[[1]], ":")
names <- sapply(pairs, function(p) p[1])
values <- as.numeric(sapply(pairs, function(p) p[2]))
cat(ranking(names, values), sep = "\n")
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator R online