行列のインデックス操作
CoddyのRジャーニー「ロジックとフロー」セクションの一部。レッスン 18/64。
m[i, j] は行 i、列 j の値です。片側を空にすると、行全体または列全体を取得できます。m[i, ] は行 i、m[, j] は列 j です。
m <- matrix(1:6, nrow = 2, byrow = TRUE)
print(m[2, 3])
print(m[1, ])
print(m[, 2])出力:
[1] 6
[1] 1 2 3
[1] 2 5同じインデックスを <- の左側でも使用できるため、セル、行、または列を置き換えられます。
m <- matrix(0, nrow = 2, ncol = 3)
m[1, 2] <- 5
m[2, ] <- c(7, 8, 9)
print(m)出力:
[,1] [,2] [,3]
[1,] 0 5 0
[2,] 7 8 9行と列には名前を付けることができ、rownames() と colnames() で設定します。すると、名前をインデックスとして使用できます。
sales <- matrix(c(3, 5, 2, 8), nrow = 2, byrow = TRUE)
rownames(sales) <- c("north", "south")
colnames(sales) <- c("jan", "feb")
print(sales["south", "feb"])
print(sales[, "jan"])出力:
[1] 8
north south
3 2 インデックスのベクトルを使うと、行と列のブロックを一度に選択できます:
m <- matrix(1:9, nrow = 3, byrow = TRUE)
print(m[1:2, 2:3])
print(m[c(1, 3), 1])出力:
[,1] [,2]
[1,] 2 3
[2,] 5 6
[1] 1 7チャレンジ
簡単cell_report(m, r, c)を完成させてください。3行を返します。Cell: に行r、列cの値を、Row: に行rの値を、Column: に列cの値を入れます。値は単一のスペースで区切ってください。
用意されているコードは、1行から行列を読み取ります。行は;で区切られ、行内の値は,で区切られます。そのため、1,2;3,4は、行1 2および3 4を持つ行列です。次の2行にはrとcが格納されます。コードは返された各行を出力します。
自分で試してみよう
cell_report <- function(m, r, c) {
# ここにコードを書いてください
c("Cell: ", "Row: ", "Column: ")
}
# 提供された入出力コード:そのままにしておいてください
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(cell_report(parse_matrix(input[1]), as.numeric(input[2]), as.numeric(input[3])), sep = "\n")
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとフローのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ