26. names 属性と要素のラベル


names 属性と要素のラベル

ベクトルには names 属性と呼ばれる属性情報を付けることが出来,要素の名前を持つベクトルは名前を使って要素を取り出すことが出来る.

mydata の各要素の名前が myname の各文字列に入っている.mydata に name 属性を付け加えるには以下のようにする.ただし names 属性の値はベクトルと同じ長さの文字型ベクトルでなければならない.

 
 mydata <- c(57, 173, 19)                     # 体重,身長,BMI のデータ
 myname <- c("weight", "height", "BMI")       # 名前
 names(mydata) <- myname                      # 名付ける
 mydata                                       # mydata に名前が付いた

weight height    BMI 
    57    173     19 

names 属性を付ける事で,ベクトルに名前でアクセスすることが出来る.

 
 mydata["BMI"]

BMI 
 19 

 mydata["BMI"][[1]]

[1] 19

ベクトルと同じようにリストも names 属性を持つことが出来る.names 属性の意味付けもベクトルの場合と同じで,リストの要素の名前として扱われる.

 
 x <- list(57, "173", c(1,9,0,4,5,0,7))       # 体重,身長,BMI のデータ
 names(x) <- c("weight", "height", "BMI")     # 名前を名付ける
 x

$weight
[1] 57

$height
[1] "173"

$BMI
[1] 1 9 0 4 5 0 7

 x$weight                                     # 名前でアクセス( x[["weight"]] でも可)

[1] 57

[[ ]] の動作と $ の動作とでは多少の違いがある.

 
 temp <- "height"                             # temp に文字列 "height" が代入される
 x[[temp]]                                    # [[ ]] の中身の式は評価されるので,

[1] "173"                                     # これは x[["height"]] と認識される

 x$temp                                       # $ の後の式は評価されないので,これは 

NULL                                          # x$temp と認識されるので NULL が返る

リストの作成時に 名前 = 要素 の形で要素を指定することによって,要素に名前を付けることも出来る. 名前は "" で囲んでも囲まなくてもよい.

 
 list(sequence=1:5, "letters"="abc")

$sequence
[1] 1 2 3 4 5

$letters
[1] "abc"

行列に names 属性を与えることによって,ラベルを付けることも出来る.

 
 x <- matrix(1:6, nrow=2, ncol=3)             # 2 * 3 の行列
 rownames(x) <- c("up", "down")               # 行の名前
 colnames(x) <- c("left", "center", "right")  # 列の名前
 x

     left center right
up      1      3     5
down    2      4     6

 x["up","right"]                              # 名前で要素にアクセスすることが出来る

[1] 5

dimnames 属性を使って行と列にラベルを付けることも出来る.行列に dimnames 属性をつけると、その行列を表示する際にそれが使われる.

 
 a <- matrix(1:6, nrow=2, ncol=3)
 dimnames(a) <- list(c("row1","row2"), c("col1","col2","col3"))
 a

     col1 col2 col3
row1    1    3    5
row2    2    4    6

行と列のどちらかのラベルが不要ならば,dimnames 属性の対応する要素を NULL にすればよい.両方のラベルが不要ならば,dimnames 属性自体を取り除けばよい.

 
 rownames(x) <- NULL                          # 行に付けられた名前を全て取り除く
 colnames(x) <- NULL                          # 列に付けられた名前を全て取り除く
 dimnames(x) <- NULL                          # 両方のラベルを取り除く

ベクトルを,そのオブジェクト名を用いて行列にする場合は以下のようにする.

 
 x <- 1:3
 y <- 4:6
 matname <- c("x", "y")                       # x, y のオブジェクト名の文字列ベクトル
 sapply(matname, get)                         # x, y を行列に(オブジェクト名=列ラベル)

     x y
[1,] 1 4
[2,] 2 5
[3,] 3 6

配列にも行列の場合と同じように dimnames 属性によって names 属性を付けることが出来る.k 次元の配列に対する dimnames 属性は長さ k のリストとなる.ラベルが不要な次元には,要素に NULL を代入すればよい.

 
 a <- array(1:16, dim=c(2, 4, 2))
 dimnames(a) <- list(NULL, c("A", "B", "C", "D"), c("a", "b"))
 a                                                            

, , a
     A B C D
[1,] 1 3 5 7
[2,] 2 4 6 8

, , b
      A  B  C  D
[1,]  9 11 13 15
[2,] 10 12 14 16

行と列のどちらかのラベルが不要なら dimnames 属性の対応する要素を NULL にし,両方のラベルが不要なら dimnames 属性自体を取り除けばよい.

 
 dimnames(a) <- list(c("row1","row2"), NULL)   # 列ラベルを削除
 dimnames(a) <- NULL                           # 全ラベルを削除

R には本質的属性 (attribute) と呼ばれる付加情報を持つことが出来,オブジェクトは必ず mode と length という 2 つの属性を持っている( names 属性の様に明示的に与える必要は無く,自動的に属性が付けられる).この mode と length 以外に names 属性や,因子オブジェクト(factor)ならば levels 属性を,行列ならば dim 属性を持つことになる.オブジェクトが持つ mode と length 以外の全ての属性を調べるには関数 attributes() を使い,mode の変更には関数 as.データ型名() を使う.また,関数 attr() により任意の属性を操作することも出来る.

以下の最後の例では,ベクトル x に dim 属性を付けることで,x を 2 × 2 行列であるかのように振舞わせている.

 
 x <- 1:4
 mode(x)                                       # x の属性を調べる
 attributes(x)                                 # mode と length 以外の全属性を調べる
 attr(x, "dim") <- c(2,2)