按键排序
本课属于 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() 添加第二个键来打破并列。这里分数按从高到低排序,分数相同时按姓名排序:
names <- c("cy", "ada", "bo")
scores <- c(80, 95, 80)
print(names[order(-scores, names)])输出:
[1] "ada" "bo" "cy" 如果没有给出第二个键,order() 会保持相同值的原始顺序。相同的位置可以重新排列多个相互关联的向量:
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. 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 在线编译器