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
|