Menu
Coddy logo textTech

キーによる並べ替え

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
challenge icon

チャレンジ

簡単

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")
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン

自分で練習してみよう: Rオンラインコンパイラ