キーによる並べ替え
CoddyのRジャーニー「ロジックとフロー」セクションの一部。レッスン 38/64。
order(x) は、x を並べ替える位置を返します。最初に最小値の位置、次にその次に小さい値の位置というように返します。これを使って別のベクトルをインデックス指定すると、x の順にそのベクトルを並べ替えられます。
names <- c("cy", "ada", "bo")
ages <- c(41, 36, 22)
print(order(ages))
print(names[order(ages)])出力:
[1] 3 2 1
[1] "bo" "ada" "cy" 降順にするには、decreasing = TRUE を渡すか、数値キーの前にマイナス記号を付けます。
names <- c("cy", "ada", "bo")
scores <- c(80, 95, 80)
print(names[order(scores, decreasing = TRUE)])
print(names[order(-scores)])出力:
[1] "ada" "cy" "bo"
[1] "ada" "cy" "bo" 同点を解消するために、order() に2つ目のキーを指定します。ここでは、スコアを高い順に並べ、スコアが同じ場合は名前順に並べます。
names <- c("cy", "ada", "bo")
scores <- c(80, 95, 80)
print(names[order(-scores, names)])出力:
[1] "ada" "bo" "cy" order() は、2 番目のキーが指定されていない場合、同値の値を元の順序のまま保持します。同じ位置を使って、互いに対応する複数のベクトルを並べ替えられます。
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])出力:
[1] "jam" "tea" "oil"
[1] 6 1 3チャレンジ
簡単ranking(names, scores) を完成させてください。最高スコアから最低スコアの順に、プレイヤー1人につき1行、1. ada 95 の形式で返します。同じスコアのプレイヤーはアルファベット順に一覧表示します。
提供されたコードは、プレイヤーをカンマで区切られた name:score のペアとして読み取り、返された各行を出力します。
自分で試してみよう
ranking <- function(names, scores) {
# ここにコードを書いてください
character(0)
}
# 提供された入出力コード:そのままにしておいてください
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")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ