23. リスト


R にはデータの種類としてベクトルや行列,配列などが用意されている( 1 や 'a' も長さ 1 のベクトル)が,リストはこれら異なる構造のデータを集めて 1 個のオブジェクトにしたものである.異なった型のベクトルを 1 個のリストにまとめてもよいし,リストの要素としてリストを用いても構わない.

リストの作成

リストは関数 list() を用いて作成する.

 
 ( x <- list(1:5, list("It's my list.", c(T, F, T))) )

[[1]]                      # 第 1 成分
[1] 1 2 3 4 5

[[2]]                      # 第 2 成分(リスト)の第 1 成分
[[2]][[1]]
[1] "It's my list."

[[2]][[2]]                 # 第 2 成分(リスト)の第 2 成分
[1]  TRUE FALSE  TRUE

リスト x について,操作例の一覧を挙げる.

コマンド

機能

length(x)

リスト x の長さを求める

x <- as.list(NULL)

リスト x を初期化する

x[1]

x の第 1 成分を取り出す(中身はリスト)

x[1:2]

第 1,第 2 成分を取り出す(中身はリスト)

x[-1]

第 1 成分以外を取り出す(中身はリスト)

x[c(T,F,T)]

第 1,第 3 成分を取り出す(中身はリスト)

x[[1]]

x の第 1 成分を取り出す(中身はリスト中の要素)

x[2] <- 10

リストの第 2 成分に 10 を代入

x[[2]] <- 10

リストの第 2 成分に 10 を代入

x[3] <- list(NULL)

リストの第 3 成分に NULL を代入する

x[3] <- NULL

リストの第 3 成分を取り除く

リスト要素へのアクセス

上記のように,[[ と ]] の間に要素の番号を指定することによって,リストの要素を取り出すことが出来る.[ と ] の間に要素の番号を指定することでもリストの要素を取り出すことは出来るが,この場合はベクトルとしてアクセスを行っていることになる.よって,要素を取り出したいのではなくてリストの一部分を抽出する場合は,ベクトルの場合と同様,[ と ] を使えばよい.ただし返り値はリストとなる.

 
 x <- list(1:3, 4:6, 7:9)
 x[1]                                 # 取り出したのはリスト

[[1]]
[1] 1 2 3

 x[[1]]                               # 取り出したのはリスト中の要素(ベクトル)

[1] 1 2 3

 x[1:2]                               # 第 1,第 2 成分を取り出す
                                      # (参考) x[[1:2]] は x[[1]][[2]] と同じ(再帰呼出し) 
[[1]]
[1] 1 2 3

[[2]]
[1] 4 5 6

[[ と ]] によって取り出されるものはリストの要素そのものであって,要素を含んだリストではないことに注意.この操作はベクトルの場合の [ と ] による部分ベクトルの取り出し(範囲指定による抽出)に対応するものではないことに注意.

ベクトルと同様にリストの連結も関数 c() や関数 append() で行なうことが出来る.

 
 c( list(1:5), list(c(T,F,T)) )         # append(list(1:5), list(c(T, F, T)))でも可

[[1]]
[1] 1 2 3 4 5

[[2]]
[1]  TRUE FALSE  TRUE

 rep(list(1:5, "It's my list."), 2)     # 関数 rep() も使用可

他にも,リストの要素を端からベクトルとして結合して 1 つのベクトルとしてまとめる関数 unlist() や,逆にベクトルをある基準で区分けしてリストとしてまとめる関数 split() がある.

 
 ( x <- split(1:10, rep(c("odd", "even"), 5)) )

$even
[1]  2  4  6  8 10

$odd
[1] 1 3 5 7 9

 unlist(x)

even1 even2 even3 even4 even5  odd1  odd2  odd3  odd4  odd5 
    2     4     6     8    10     1     3     5     7     9