R入門
リスト
最終更新:
r-intro
目次
リストとは
リストとは、異なる種類のオブジェクトを一つにまとめたオブジェクトのこと。ベクトルは同じ種類の情報しか一まとめにできないが、リストは、数値、文字列、ベクトル、データフレームなど種類を問わず一まとめにすることができる。含めるベクトルは種類が異なっていてもかまわず、リスト自身も含めることもできる。要素数も揃える必要はない。
list関数の引数に与えたると、それらが一つずつ要素となり一つのリストになる。
> c(1, 2, 3)
[1] 1 2 3
> c(1, 2, "a")
[1] "1" "2" "a"
> n <- 1:3
> name <- c("セナディア", "ヘリア", "コラリー")
> cv <- c("鈴木みのり", "近藤唯", "会沢紗弥")
> dt <- as.Date("2012-03-03") + 1:2
> lis <- list(n, name, cv, "崩壊3rd", dt)
> print(lis)
[[1]]
[1] 1 2 3
[[2]]
[1] "セナディア" "ヘリア" "コラリー"
[[3]]
[1] "鈴木みのり" "近藤唯" "会沢紗弥"
[[4]]
[1] "崩壊3rd"
[[5]]
[1] "2012-03-04" "2012-03-05"
> typeof(lis)
[1] "list"
リストを作成する
list関数を使う。引数に要素とするオブジェクトを指定する。含める要素にリストを指定することもできる。
> n <- 1:3
> name <- c("セナディア", "ヘリア", "コラリー")
> cv <- c("鈴木みのり", "近藤唯", "会沢紗弥")
> dt <- as.Date("2012-03-03") + 1:2
> lis <- list(n, name, cv, "崩壊3rd", dt)
> print(lis)
[[1]]
[1] 1 2 3
[[2]]
[1] "セナディア" "ヘリア" "コラリー"
[[3]]
[1] "鈴木みのり" "近藤唯" "会沢紗弥"
[[4]]
[1] "崩壊3rd"
[[5]]
[1] "2012-03-04" "2012-03-05"
> lis <- list("鈴木みのり", list("近藤唯", "会沢沙弥"))
> print(lis)
[[1]]
[1] "鈴木みのり"
[[2]]
[[2]][[1]]
[1] "近藤唯"
[[2]][[2]]
[1] "会沢沙弥"
リストの宣言と初期化
list関数を使う。
> n <- 1:3
> s <- c("A", "B", "C")
> lst <- list(n, s)
> print(lst)
[[1]]
[1] 1 2 3
[[2]]
[1] "A" "B" "C"
リストから要素を取り出す
[ ]演算子と[[ ]]演算子を使う。それぞれインデックスを与える。[ ]演算子は要素をリストで、[[ ]]演算子は要素をベクトルで返す。
> n <- 1:3
> s <- c("A", "B", "C")
> lst <- list(n, s)
> lst[2]
[[1]]
[1] "A" "B" "C"
> lst[[2]]
[1] "A" "B" "C"
リストの要素数を調べる
length関数を使う。
> n <- 1:10
> s <- c("A", "B", "C")
> lst <- list(n, s)
> print(lst)
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
[[2]]
[1] "A" "B" "C"
> length(lst)
[1] 2
リストに要素を追加する
append関数を使う。デフォルトでは最後に追加する。特定の要素の後に追加したい場合は、afterオプションに挿入前のインデックスを指定する。
> n <- 1:3
> s <- c("A", "B", "C")
> d <- c(1.1, 2.2, 3.3)
> lst0 <- list(n, s)
> print(lst0)
[[1]]
[1] 1 2 3
[[2]]
[1] "A" "B" "C"
> lst1 <- append(lst0, list(d))
> print(lst1)
[[1]]
[1] 1 2 3
[[2]]
[1] "A" "B" "C"
[[3]]
[1] 1.1 2.2 3.3
> lst2 <- append(lst0, list(d), after = 1)
> print(lst2)
[[1]]
[1] 1 2 3
[[2]]
[1] 1.1 2.2 3.3
[[3]]
[1] "A" "B" "C"
要素に名前を付けてリストを作成する
list関数で=演算子を使い、名前を指定すればよい。3つ目の要素のとおりに、指定をしなければ名前はつかない。
> s1 <- c("セナディア", "イレイナ")
> s2 <- c("鈴木みのり", "本渡楓")
> s3 <- c("崩壊3rd", "魔女の旅々")
> lst <- list(chara = s1, `声優` = s2, s3)
> print(lst)
$chara
[1] "セナディア" "イレイナ"
$声優
[1] "鈴木みのり" "本渡楓"
[[3]]
[1] "崩壊3rd" "魔女の旅々"
リストの要素に後から名前を付ける
names関数を使う。この関数は特定の要素だけに名前を付けることはできず、全要素一括でなければできないことに注意。名前を付けたくない要素には””を指定する。
> s1 <- c("セナディア", "イレイナ")
> s2 <- c("鈴木みのり", "本渡楓")
> s3 <- c("崩壊3rd", "魔女の旅々")
> lst <- list(s1, s2, s3)
> lst
[[1]]
[1] "セナディア" "イレイナ"
[[2]]
[1] "鈴木みのり" "本渡楓"
[[3]]
[1] "崩壊3rd" "魔女の旅々"
> names(lst) <- c("名前", "声優", "作品")
> lst
$名前
[1] "セナディア" "イレイナ"
$声優
[1] "鈴木みのり" "本渡楓"
$作品
[1] "崩壊3rd" "魔女の旅々"
> names(lst) <- c("名前", "", "作品")
> lst
$名前
[1] "セナディア" "イレイナ"
[[2]]
[1] "鈴木みのり" "本渡楓"
$作品
[1] "崩壊3rd" "魔女の旅々"
リストをベクトルに変換する
unlist関数を使う。オブジェクトの型が異なる場合は、一つに揃えられるので注意。以下の例では、数値型が文字列型に強制変換されて、ベクトル化されている。
> lst <- list(1:3, c("A", "B", "C"))
> print(lst)
[[1]]
[1] 1 2 3
[[2]]
[1] "A" "B" "C"
> unlist(lst)
[1] "1" "2" "3" "A" "B" "C"
リストの要素を逆順に並び替える
rev関数を使う。
> n <- 1:3
> s <- c("A", "B", "C")
> d <- c(2.4, 6.8)
> lst <- list(n, s, d)
> print(lst)
[[1]]
[1] 1 2 3
[[2]]
[1] "A" "B" "C"
[[3]]
[1] 2.4 6.8
> print(rev(lst))
[[1]]
[1] 2.4 6.8
[[2]]
[1] "A" "B" "C"
[[3]]
[1] 1 2 3
リストの各要素に一括で関数を適用する
lapply関数かsapply関数を使う。この2つの関数の処理は同じで、戻り値が前者はリスト、後者はベクトル(各要素の戻り値が複数になる場合はリスト)と異なるだけ。以下は、3つの英文を空白で分割し、3つの文の分割した各要素数とそれらの要素(文字列)の長さを調べた例。
> s <- character(3)
> s[1] <- "Iwami Manaka played the part of Rice Shower."
> s[2] <- "She's very good in the part."
> s[3] <- "She's a brilliant actress."
> words <- strsplit(s, "\\s+")
> print(words)
[[1]]
[1] "Iwami" "Manaka" "played" "the" "part" "of" "Rice" "Shower."
[[2]]
[1] "She's" "very" "good" "in" "the" "part."
[[3]]
[1] "She's" "a" "brilliant" "actress."
> lapply(words, length)
[[1]]
[1] 8
[[2]]
[1] 6
[[3]]
[1] 4
> sapply(words, length)
[1] 8 6 4
> lapply(words, nchar)
[[1]]
[1] 5 6 6 3 4 2 4 7
[[2]]
[1] 5 4 4 2 3 5
[[3]]
[1] 5 1 9 8
> sapply(words, nchar)
[[1]]
[1] 5 6 6 3 4 2 4 7
[[2]]
[1] 5 4 4 2 3 5
[[3]]
[1] 5 1 9 8
リストから要素を取り出す
[ ]演算子と[[ ]]演算子を使いそれぞれインデックスを与えると要素を取り出すことができる。戻り値は[ ]演算子はリスト、[[ ]]演算子はベクトルになる。
> chara <- c("ライスシャワー", "メイショウドトウ", "フィー", "黒川あかね")
> sakuhin <- c("ウマ娘", "ライザのアトリエ2", "推しの子")
> seiyu <- c("石見舞菜香", "和多田美咲")
> lis <- list(chara, sakuhin, seiyu)
> print(lis)
[[1]]
[1] "ライスシャワー" "メイショウドトウ" "フィー"
[4] "黒川あかね"
[[2]]
[1] "ウマ娘" "ライザのアトリエ2" "推しの子"
[[3]]
[1] "石見舞菜香" "和多田美咲"
[ ]演算子は指定の要素を単純にリストで返す。複数のインデックスで指定することも可能。
> lis[2]
[[1]]
[1] "ウマ娘" "ライザのアトリエ2" "推しの子"
> lis[2:3]
[[1]]
[1] "ウマ娘" "ライザのアトリエ2" "推しの子"
[[2]]
[1] "石見舞菜香" "和多田美咲"
[[ ]]演算子は指定の要素をベクトルで返す。複数のインデックスで指定することはできず、以下の例のとおりc(○,×)と指定すると、要素がベクトルであれば、リストの○番目の要素の、その要素の×番目のベクトルの要素を返す。
> lis[[2]]
[1] "ウマ娘" "ライザのアトリエ2" "推しの子"
> lis[[c(2, 1)]]
[1] "ウマ娘"
> lis[[c(3, 2)]]
[1] "和多田美咲"
リストの複数の要素をベクトルでまとめて返したい場合は、unlist関数を利用する。
> unlist(lis[2:3])
[1] "ウマ娘" "ライザのアトリエ2" "推しの子"
[4] "石見舞菜香" "和多田美咲"
リストの要素を削除する
削除したい要素にNULLを代入する。以下の例のとおり、ベクトルと異なりリストの要素にNULLを代入すると、その要素は消去され順番が詰まり、リストの要素数が一つ減る。
> chara <- c("ライスシャワー", "メイショウドトウ", "フィー", "黒川あかね")
> sakuhin <- c("ウマ娘", "ライザのアトリエ2", "推しの子")
> seiyu <- c("石見舞菜香", "和多田美咲")
> lis <- list(chara, sakuhin, seiyu)
> print(lis)
[[1]]
[1] "ライスシャワー" "メイショウドトウ" "フィー"
[4] "黒川あかね"
[[2]]
[1] "ウマ娘" "ライザのアトリエ2" "推しの子"
[[3]]
[1] "石見舞菜香" "和多田美咲"
> lis[2] <- NULL
> print(lis)
[[1]]
[1] "ライスシャワー" "メイショウドトウ" "フィー"
[4] "黒川あかね"
[[2]]
[1] "石見舞菜香" "和多田美咲"
リストの各要素からインデックスを指定してまとめて値を抜き出す
sapply関数に「[[」を指定して使う。以下は、要素がすべてベクトルのリストについて、各要素の1~3番目の要素を抜き出した例。3番目の要素は要素が二つしかないため、3番目の要素を抜き出そうとするとエラーが発生する。lapply関数を使えば、戻り値はリストになる。参考に、最初にリストの各要素の要素数を得ている。
> chara <- c("ライスシャワー", "メイショウドトウ", "フィー", "黒川あかね")
> sakuhin <- c("ウマ娘", "ライザのアトリエ2", "推しの子")
> seiyu <- c("石見舞菜香", "和多田美咲")
> lis <- list(chara, sakuhin, seiyu)
> print(lis)
[[1]]
[1] "ライスシャワー" "メイショウドトウ" "フィー" "黒川あかね"
[[2]]
[1] "ウマ娘" "ライザのアトリエ2" "推しの子"
[[3]]
[1] "石見舞菜香" "和多田美咲"
> sapply(lis, length)
[1] 4 3 2
> sapply(lis, "[[", 1)
[1] "ライスシャワー" "ウマ娘" "石見舞菜香"
> sapply(lis, "[[", 2)
[1] "メイショウドトウ" "ライザのアトリエ2" "和多田美咲"
> sapply(lis, "[[", 3)
FUN(X[[i]], ...) でエラー: 添え字が許される範囲外です
> lapply(lis, "[[", 1)
[[1]]
[1] "ライスシャワー"
[[2]]
[1] "ウマ娘"
[[3]]
[1] "石見舞菜香"
> lapply(lis, "[[", 2)
[[1]]
[1] "メイショウドトウ"
[[2]]
[1] "ライザのアトリエ2"
[[3]]
[1] "和多田美咲"
> lapply(lis, "[[", 3)
FUN(X[[i]], ...) でエラー: 添え字が許される範囲外です
リストを連結する
c関数を使う。
> lis1 <- list(1:2, c("リフ", "瀬戸麻沙美"))
> lis2 <- list(3:5, "スノウブレイク")
> lis1
[[1]]
[1] 1 2
[[2]]
[1] "リフ" "瀬戸麻沙美"
> lis2
[[1]]
[1] 3 4 5
[[2]]
[1] "スノウブレイク"
> lis <- c(lis1, lis2)
> lis
[[1]]
[1] 1 2
[[2]]
[1] "リフ" "瀬戸麻沙美"
[[3]]
[1] 3 4 5
[[4]]
[1] "スノウブレイク"
リストに名前を付けた要素を追加する
list関数とc関数を組み合わせて使う。
> no <- 1:2
> name <- c("リフ", "セナディア")
> seiyu <- c("瀬戸麻沙美", "鈴木みのり")
> lis <- list(no, name)
> print(lis)
[[1]]
[1] 1 2
[[2]]
[1] "リフ" "セナディア"
> lis <- c(lis, list(seiyu = seiyu))
> print(lis)
[[1]]
[1] 1 2
[[2]]
[1] "リフ" "セナディア"
$seiyu
[1] "瀬戸麻沙美" "鈴木みのり"
> lis <- c(lis, list(`声優` = seiyu))
> print(lis)
[[1]]
[1] 1 2
[[2]]
[1] "リフ" "セナディア"
$seiyu
[1] "瀬戸麻沙美" "鈴木みのり"
$声優
[1] "瀬戸麻沙美" "鈴木みのり"
特殊な文字が含まれる名前を付けた要素からなるリストを作成する
要素名を指定する際、通常の単語はそのまま指定すればよいが、例えば空白を含むような特殊な文字を含む場合は、指定する要素名を「‘」(バックティック)で囲む必要があるので注意。
> name <- c("リフ", "セナディア")
> seiyu <- c("瀬戸麻沙美", "鈴木みのり")
> lis <- list(name = name, @seiyu = seiyu)
エラー: 予想外の '@' です ( "lis <- list(name = name, @" の)
> lis <- list(name = name, 声 優 = seiyu)
エラー: 想定外のシンボルです ( "lis <- list(name = name, 声 優" の)
> lis <- list(name = name, `@seiyu` = seiyu, `声 優` = seiyu)
> print(lis)
$name
[1] "リフ" "セナディア"
$`@seiyu`
[1] "瀬戸麻沙美" "鈴木みのり"
$`声 優`
[1] "瀬戸麻沙美" "鈴木みのり"