R

dimとdimnamesとnames(dim())とnames(dimnames())

ある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"