はじめに
リストはインデックス付きのオブジェクト群であり、異なるデータ型を含むことができる。その強みと有用性は汎用性にあります。Rでは、複雑な関数の出力を収集・保存するためによく使われます。データフレームはリストの特殊な形です。
リストはlist(...)関数を使って作成され、カンマで区切られた引数を受け取ります。サブリストを選択するには単一角括弧を使用し、単一要素を抽出するには二重角括弧を使用します。
> my.list <- list("one", TRUE, 3, c("f", "o", "u", "r"))
> my.list
[[1]]
[1] "one"
[[2]]
[1] TRUE
[[3]]
[1] 3
[[4]]
[1] "f" "o" "u" "r"
リストには様々な型の要素が含まれていることがわかります。
> mode(my.list)
[1] "list"
変数の型がリストであることが確認できます。
> my.list[[2]]
[1] TRUE
二重角括弧を使用して単一要素を抽出できます。
> mode(my.list[[3]])
[1] "numeric"
> mode(my.list[2])
[1] "list"
単一角括弧はサブリストを取得し、二重角括弧はベクトル要素を取得します。
> my.list <- list(first="one", second=TRUE, third=3, fourth=c("f", "o", "u", "r"))
> names(my.list)
[1] "first" "second" "third" "fourth"
> str(my.list)
List of 4
$ first : chr "one"
$ second: logi TRUE
$ third : num 3
$ fourth: chr [1:4] "f" "o" "u" "r"
サブリストに名前を付けることができます。
> names(my.list) <- c("First element", "Second element", "Third element", "Fourth element")
> my.list$`Second element`
[1] TRUE
サブリストの名前を更新することも可能です。
> x <- list(1, c(2, 3), c(4, 5, 6), list(c(1, 2, 3, 4), c("hello A", "hello B")))
> x
[[1]]
[1] 1
[[2]]
[1] 2 3
[[3]]
[1] 4 5 6
[[4]]
[[4]][[1]]
[1] 1 2 3 4
[[4]][[2]]
[1] "hello A" "hello B"
リストの中に別のリストを追加できます。
> unlist(x)
[1] "1" "2" "3" "4" "5" "6" "1" "2"
[9] "3" "4" "hello A" "hello B"
リストを平坦化してすべてのベクトル要素を取得できます。すべてのサブリストはリストに変換されます。
unlist(x, recursive = FALSE)
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
[[4]]
[1] 4
[[5]]
[1] 5
[[6]]
[1] 6
[[7]]
[1] 1 2 3 4
[[8]]
[1] "hello A" "hello B"
一度だけ平坦化することも可能です。
OLSの結果はリスト形式であり、リスト操作を使用して処理できます。
> lm.xy <- lm(y ~ x, data=data.frame(x=1:5, y=1:5))
> names(lm.xy)
[1] "coefficients" "residuals" "effects" "rank" "fitted.values"
[6] "assign" "qr" "df.residual" "xlevels" "call"
[11] "terms" "model"
> mode(lm.xy)
[1] "list"
リスト操作で一致する結果を得る練習問題
premierships <- list(Adelaide = c(1997, 1998),
Carlton = c(1906, 1907, 1908, 1914, 1915, 1938, 1945, 1947, 1968, 1970, 1972, 1979, 1981, 1982, 1987, 1995),
Collingwood = c(1902, 1903, 1910, 1917, 1919, 1927, 1928, 1929, 1930, 1935, 1936, 1953, 1958, 1990))
year <- 1917
for (i in 1:length(premierships)) {
if (year %in% premierships[[i]]){
winner <- names(premierships)[i]
}
}
> winner
[1] "Collingwood"
リストを作成し、forループを使用して一致する結果を取得します。