Menu
CoddyTech

Tóm tắt hàng và cột

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 19 trên 64.

rowSums() và rowMeans() trả về một kết quả cho mỗi hàng; colSums() và colMeans() trả về một kết quả cho mỗi cột. Ở đây, mỗi hàng là một học sinh và mỗi cột là một bài kiểm tra:

scores <- matrix(c(80, 90, 70, 60, 75, 85), nrow = 2, byrow = TRUE)
print(rowMeans(scores))
print(colSums(scores))

Đầu ra:

[1] 80.00000 73.33333
[1] 140 165 155

Với mọi phép tổng hợp khác, apply(m, 1, f) gọi f trên từng hàng và apply(m, 2, f) trên từng cột:

scores <- matrix(c(80, 90, 70, 60, 75, 85), nrow = 2, byrow = TRUE)
print(apply(scores, 1, max))
print(apply(scores, 2, min))

Đầu ra:

[1] 90 85
[1] 60 75 70

Kết hợp phép tính tóm tắt với which.max() để tìm hàng hoặc cột nào có giá trị cao nhất:

scores <- matrix(c(80, 90, 70, 60, 75, 85), nrow = 2, byrow = TRUE)
best_test <- which.max(colMeans(scores))
print(best_test)
print(round(rowMeans(scores), 1))

Đầu ra:

[1] 2
[1] 80.0 73.3

apply() cũng chấp nhận một hàm mà bạn viết ngay tại chỗ bằng function(r). Ở đây, hàm này đếm các giá trị lớn hơn 5 trong mỗi hàng:

m <- matrix(c(3, 8, 1, 9, 2, 7), nrow = 2, byrow = TRUE)
print(apply(m, 1, function(r) sum(r > 5)))

Đầu ra:

[1] 1 2
challenge icon

Thử thách

Dễ

Hoàn thiện class_report(scores). Mỗi hàng của scores là một học sinh và mỗi cột là một bài kiểm tra. Trả về một dòng cho mỗi học sinh, Student 1: 81.7, kèm giá trị trung bình được làm tròn đến một chữ số thập phân. Thêm dòng cuối Best test: , theo sau là số thứ tự của cột có giá trị trung bình cao nhất.

Code được cung cấp đọc một ma trận từ một dòng: các hàng được phân tách bằng ; và các giá trị trong một hàng được phân tách bằng ,, vì vậy 1,2;3,4 là ma trận có các hàng 1 2 và 3 4. Code in ra từng dòng được trả về.

Tự làm thử

class_report <- function(scores) {
  # Viết code của bạn ở đây
  character(0)
}

# Đoạn code đầu vào/đầu ra đã cung cấp: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
parse_matrix <- function(line) {
  rows <- strsplit(line, ";")[[1]]
  matrix(as.numeric(unlist(strsplit(rows, ","))), nrow = length(rows), byrow = TRUE)
}
cat(class_report(parse_matrix(input[1])), sep = "\n")
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch R online