R言語におけるリストの基本概念

はじめに

リストはインデックス付きのオブジェクト群であり、異なるデータ型を含むことができる。その強みと有用性は汎用性にあります。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ループを使用して一致する結果を取得します。

タグ: R言語 リスト データ構造 プログラミング

7月22日 03:43 投稿