行と列の集計
CoddyのRジャーニー「ロジックとフロー」セクションの一部。レッスン 19/64。
rowSums() と rowMeans() は各行につき1つの結果を返し、colSums() と colMeans() は各列につき1つの結果を返します。ここでは、各行が学生、各列がテストを表します:
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) はすべての列に対して呼び出します。
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.3apply()は、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チャレンジ
簡単class_report(scores)を完成させてください。scoresの各行は学生を、各列はテストを表します。学生ごとに1行ずつ、Student 1: 81.7の形式で返し、学生の平均を小数第1位に丸めてください。最後の行にBest test: を追加し、その後に平均が最も高い列の番号を続けてください。
提供されたコードは、1行から行列を読み取ります。行は;で区切り、行の値は,で区切るため、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")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ