R

トップページ
Google
WWWを検索
サイト内を検索

他のプログラミング言語の連想配列やハッシュ関数と概ね同等ですが、構造体などがないので複合データは必ずリストになります。リストが苦手だと不自由な環境ですが、ここにあるぐらいの事をざっと把握しておくと、不自由がだいぶ減ります。

1 リストを作成

大した話ではなく、気軽に作れます。

1.1 空リストを作成

lst <- list()
lst
list()

1.2 中身のあるリストを作成

lst <- list("a"=123, "b"=456, "c"=789)
lst
$a
[1] 123

$b
[1] 456

$c
[1] 789

1.3 ベクターをリストに変えて、名前をつける

lst <- as.list(c(123, 456, 789))
names(lst) <- c("a", "b", "c")
lst
$a
[1] 123

$b
[1] 456

$c
[1] 789

1.4 ベクトルのリストをつくる

リストの要素の長さは異なっても問題ないです。

vlst <- list("a"=c(1, 2, 3), "b"=c(4, 5, 6), "c"=c(7, 8, 9, 10))
vlst
$a
[1] 1 2 3

$b
[1] 4 5 6

$c
[1]  7  8  9 10

1.5 値を評価しないで入れる

listは要素の値に式が指定すると、リストに入れる前に評価しますが、alistは式をクロージャ(callオブジェクト)として格納して評価を避けられます。

if(exists("y")) rm(y)
# list(x=y^2) # エラーになる
alist(x=y^2) # エラーにならない
$x
y^2

1.6 空要素を入れる

関数オブジェクトを操作するような特殊な用途でしか使わないと思いますが、空要素を入れることもできます。

list(a=1, quote(expr=), b=2)
$a
[1] 1

[[2]]


$b
[1] 2

2 リストのサブセットをつくる

リストの一部分のリストをつくるのも簡単です。

2.1 n番目の要素だけを抽出したリストを作る

# 1番目の要素
lst[1]
$a
[1] 123

2.2 名前指定で一部の要素のリストを作る

lst[c("b", "c")] 
$b
[1] 456

$c
[1] 789

2.3 各要素のn番目の値だけで作りなおす

これはやや複雑で、lapplyでリストの各要素をgetElement関数のsynonymである[[で処理しています。

# リストの各要素の3番目の値だけで、リストを作りなおす
lapply(vlst, "[[", 3)
$a
[1] 3

$b
[1] 6

$c
[1] 9

3 リストの要素の値を参照する

# 2番目の要素の値を得る
lst[[2]]
[1] 456
# 3番目の要素の値を得る
getElement(lst, 3)
[1] 789
# 名前"a"の要素の値を得る
lst[["a"]]
[1] 123

4 リストにデータを追加する

# "d"を追加する
lst["d"] <- 0

4.1 複数のリストを統合する

# "d"を追加する
c(lst, list(x=0.1, y=0.2, z=-0.1))
$a
[1] 123

$b
[1] 456

$c
[1] 789

$d
[1] 0

$x
[1] 0.1

$y
[1] 0.2

$z
[1] -0.1

5 リストからデータを削除する

# "b"を消す
lst["b"] <- NULL

6 リストに要素があるか調べる

# 名前"d"の要素が含まれているか調べる
if(!is.null(lst[["d"]])) print("名前dの要素は無い")
[1] "名前dの要素は無い"

7 リストの要素の名前をすべて得る

names(lst)
[1] "a" "c" "d"

8 リストの要素をすべて得る

unlist(lst)
  a   c   d 
123 789   0 

9 リストの長さを得る

length(lst)
[1] 3

10 リストの中身を操作する

# 全部の要素から17を引いたリストをつくる
lapply(lst, function(x){ x - 17 })
$a
[1] 106

$c
[1] 772

$d
[1] -17
# 全部の要素に31を足したベクトルを得る
sapply(lst, function(x){ x + 31 })
  a   c   d 
154 820  31 
# リストの各要素の2番目の値を取り出す
sapply(vlst, "[[", 2) # "[["はgetElementでもOK
a b c 
2 5 8