Sắp xếp theo khóa
Thuộc phần Logic và luồng điều khiển trong hành trình R của Coddy. Bài học 38 trên 64.
order(x) trả về các vị trí giúp sắp xếp x: trước tiên là vị trí của giá trị nhỏ nhất, tiếp theo là vị trí của giá trị kế tiếp, cứ thế tiếp tục. Dùng các vị trí này làm chỉ số cho một vectơ khác để sắp xếp vectơ đó theo x:
names <- c("cy", "ada", "bo")
ages <- c(41, 36, 22)
print(order(ages))
print(names[order(ages)])Đầu ra:
[1] 3 2 1
[1] "bo" "ada" "cy" Để sắp xếp theo thứ tự giảm dần, hãy truyền decreasing = TRUE hoặc đặt dấu trừ trước khóa số:
names <- c("cy", "ada", "bo")
scores <- c(80, 95, 80)
print(names[order(scores, decreasing = TRUE)])
print(names[order(-scores)])Đầu ra:
[1] "ada" "cy" "bo"
[1] "ada" "cy" "bo" Truyền cho order() một khóa thứ hai để phân định các giá trị bằng nhau. Ở đây, điểm được sắp xếp từ cao xuống thấp, còn các điểm bằng nhau được sắp xếp theo tên:
names <- c("cy", "ada", "bo")
scores <- c(80, 95, 80)
print(names[order(-scores, names)])Đầu ra:
[1] "ada" "bo" "cy" order() giữ nguyên thứ tự ban đầu của các giá trị bằng nhau khi không có khóa thứ hai. Cùng các vị trí đó có thể sắp xếp lại nhiều vector có liên quan với nhau:
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])Đầu ra:
[1] "jam" "tea" "oil"
[1] 6 1 3Thử thách
DễHoàn thiện ranking(names, scores). Trả về mỗi người chơi trên một dòng, 1. ada 95, từ điểm cao nhất đến thấp nhất. Người chơi có cùng điểm được liệt kê theo thứ tự bảng chữ cái.
Đoạn code được cung cấp đọc người chơi dưới dạng các cặp name:score được phân tách bằng dấu phẩy và in ra từng dòng được trả về.
Tự làm thử
ranking <- function(names, scores) {
# Viết code của bạn ở đây
character(0)
}
# Đoạn code đầu vào/đầu ra có sẵn: giữ nguyên
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")
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng điều khiển
1Chuỗi chuyên sâu
Chuỗi con với substr()Định dạng với sprintf()Tách và nối chuỗiTìm kiếm trong chuỗiThay thế văn bảnÔn tập: Tạo tên người dùng10Luồng điều khiển nâng cao
Hàm switch()ifelse() dạng vector hóarepeat và breakHàm đệ quyÔn tập: phân loại điểmTự luyện tập: Trình biên dịch R online