ある3×4の行列Aがあったとする。
A <- matrix(runif(3*4), 3, 4)
dimはこの行列のサイズを返す。
dim(A)
# [1] 3 4
dimnamesはこの行列の行名、列名を一度に設定する。
dimnames(A) <- list(
X=paste0("x", 1:3),
Y=paste0("y", 1:4))
これにより、dimnames(A)で、該当する情報が返ってくるようになる。
dimnames(A)
# $X
# [1] "x1" "x2" "x3"
#
# $Y
# [1] "y1" "y2" "y3" "y4"
後から部分的に、名前を変えることもできる。
dimnames(A)$X[1] <- "xx1"
dimnames(A)
# $X
# [1] "xx1" "x2" "x3"
#
# $Y
# [1] "y1" "y2" "y3" "y4"
このXやYの部分のような、行・列全体に対する名前は、names(dimnames(A))でとってこれる。
names(dimnames(A))
# [1] "X" "Y"
ところで、このような名前を、dimのほうで登録しておくこともできる。
このような情報は、names(dimnames(A))とは別の箇所に記述されるらしい。
どちらか書き換えても、変更が連動したりもしない。
# 最初は何も書かれていない
names(dim(A))
# NULL
names(dim(A)) <- c("X", "Y")
dim(A)
# X Y
# 3 4
names(dim(A))
[1] "X" "Y"
あとから書き換えることも可能。
names(dim(A))[1] <- "J"
names(dim(A))
# [1] "J" "Y"
もっと高次元配列でも同様に考える。
例えば、3×4×5の3次元配列B(テンソル)があったとする。
B <- array(runif(3*4*5), dim=c(3,4,5))
dimはこのテンソルのサイズを返す。
dim(B)
# [1] 3 4 5
dimnamesはこのテンソルのオーダーごとの名前を一度に設定する。
dimnames(B) <- list(
X=paste0("x", 1:3),
Y=paste0("y", 1:4),
Z=paste0("z", 1:5))
これにより、dimnames(B)で、該当する情報が返ってくるようになる。
dimnames(B)
# $X
# [1] "x1" "x2" "x3"
#
# $Y
# [1] "y1" "y2" "y3" "y4"
#
# $Z
# [1] "z1" "z2" "z3" "z4" "z5"
後から部分的に、名前を変えることもできる。
dimnames(B)$X[1] <- "xx1"
dimnames(B)
# $X
# [1] "xx1" "x2" "x3"
#
# $Y
# [1] "y1" "y2" "y3" "y4"
#
# $Z
# [1] "z1" "z2" "z3" "z4" "z5"
このX、Y、Zのような、モード全体に対する名前は、names(dimnames(B))でとってこれる。
names(dimnames(B))
# [1] "X" "Y" "Z"
dimのほうでもモードの名前を登録しておくこともできる。
テンソルの場合でも、このような情報は、names(dimnames())とは別の箇所に記述されるらしい。
# 最初は何も書かれていない
names(dim(B))
# NULL
names(dim(B)) <- c("X", "Y", "Z")
dim(B)
# X Y Z
# 3 4 5
names(dim(B))
[1] "X" "Y" "Z"
あとから書き換えることも可能。
names(dim(B))[1] <- "J"
names(dim(B))
# [1] "J" "Y" "Z"