Menu
CoddyTech

行和列汇总

本课属于 Coddy R 学习旅程的“逻辑与流程”单元。第 19 课,共 64 课。

rowSums() 和 rowMeans() 每行返回一个结果;colSums() 和 colMeans() 每列返回一个结果。这里每行代表一名学生,每列代表一次测试:

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

输出:

[1] 80.00000 73.33333
[1] 140 165 155

对于其他汇总操作,apply(m, 1, f) 会对每一行调用 f,而 apply(m, 2, f) 会对每一列调用 f:

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

输出:

[1] 90 85
[1] 60 75 70

将汇总结果与 which.max() 结合起来,找出哪一行或哪一列的结果最好:

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))

输出:

[1] 2
[1] 80.0 73.3

apply() 还接受你用 function(r) 当场编写的函数。这里,它会统计每行中大于 5 的值的个数:

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

输出:

[1] 1 2
challenge icon

挑战

简单

补全 class_report(scores)。scores 的每一行代表一名学生,每一列代表一场测试。每名学生返回一行,Student 1: 81.7,其中包含该学生的平均分,四舍五入到小数点后一位。最后添加一行 Best test: ,后面跟着平均分最高的列的编号。

提供的代码会从一行中读取一个矩阵:行之间用 ; 分隔,每行中的值用 , 分隔,因此 1,2;3,4 是一个矩阵,其行分别是 1 2 和 3 4。代码会打印每一行返回值。

亲手试试

class_report <- function(scores) {
  # 在这里编写你的代码
  character(0)
}

# 提供的输入和输出代码:保持原样
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 icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: R 在线编译器