R言語のリストの操作(作成や値の代入、要素の追加など)をまとめました。
この記事では以下のリストに関する操作を実行例とともに分かりやすく解説しています。
この記事で学べる事
- リストの作成
- リストの参照
- リストの要素の取得
- リストの要素の変更
- 名前の変更
- 要素の追加・挿入・削除
- リストの結合
- リストの並び替え・ソート
- 欠測値の処理
- リストの型(type)の変更
- リストの演算
- リストを用いた集合演算
- 行と列の合計・平均・分散
- リストの度数表を作成
- リストのファイルへの保存
データ解析で必要不可欠なリスト(list)の基本操作をまとめました。
この記事で扱うプログラミングコードは以下からダウンロードできます。
リストの操作のテンプレートとして使っていただいて構いません。
R言語 リストの操作
また、データフレーム、ベクトルの操作方法については次の記事で解説しています。
【R言語】データフレーム操作 作成・値の代入・行と列の追加と削除など
R言語を使う際に避けては通れない道であるデータフレームの操作について解説します。 データフレーム(data.frame)はデータセットを格納するための行列であり、データ解析をするうえで必要不可欠です。 ...
続きを見る
【R言語】ベクトルの操作 作成・値の代入・要素の追加など
R言語のベクトルの操作(作成や参照、代入、要素の追加など)をまとめました。 この記事では以下のベクトルに関する操作を実行例付きで分かりやすく解説しています。 この記事で学べる事 ベクトルの作成 ベクト ...
続きを見る
この記事は複数のページで構成されています。
各ページの内容
- 1ページ目でリストの作成、参照、要素の取得、要素の変更、名前の付与と変更、リストの要素の追加と削除
- 2ページ目でリストの結合、並び替えとソート、欠測値の処理、リストの型の変更、リストの演算、集合演算、合計・平均・分散の計算、度数表、リストの保存
を扱っています。 リストの結合や並び替え、ソートなどについては2ページ目以降を参照してください。
リストの作成
リストを作成するには関数listを用います。
関数listの引数に要素をカンマ「,」区切りで渡すことで、その引数を要素に持つリストを作成することができます。
引数に何も指定しない場合、空のリストが作成されます。
指定した長さのNULLから成るリストは関数vectorを使って作成することができます(関数listにNULLを並べることでも作成できます)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | > #リストの作成 > lst0 <- list() #空のリスト > lst0 list() > > lst0 <- vector("list", 5) #指定した長さのNULLから成るリスト > lst0 [[1]] NULL [[2]] NULL [[3]] NULL [[4]] NULL [[5]] NULL > > lst1 <- list(1, 2, 3, 4, 5) #指定した要素から成るリスト > lst1 [[1]] [1] 1 [[2]] [1] 2 [[3]] [1] 3 [[4]] [1] 4 [[5]] [1] 5 |
リストの要素に異なる方を持たせることができ、例えば1つ目の要素にnumeric型、2つ目の要素にcharacter型の要素を持たせることが可能です。
さらに、リストの中にベクトルやデータフレームなどを持たせることができるのでベクトルよりも柔軟にデータを構成することが可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | > lst2 <- list(1, 2, "a", "b", c(1, 2, 3), + data.frame(numbers = seq_len(5), + letters = letters[seq_len(5)])) > lst2 [[1]] [1] 1 [[2]] [1] 2 [[3]] [1] "a" [[4]] [1] "b" [[5]] [1] 1 2 3 [[6]] numbers letters 1 1 a 2 2 b 3 3 c 4 4 d 5 5 e |
リストに名前を持たせるには、次のように「名前 = 要素」の形で関数listの引数に指定します。
1 2 3 4 5 6 7 8 9 10 | > lst3 <- list("a" = 1, "b" = 2, "c" = 3) #名前を持つリスト > lst3 $a [1] 1 $b [1] 2 $c [1] 3 |
リストの参照
続いてリストの参照方法について見ていきます。
次のように関数head、tailによってリストの先頭部分、末尾部分を参照することができます。
リストの要素が多いときにどのような値を持つのか確認したいときに便利です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | > #リストの参照 > lst4 <- list(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) > > head(lst4) [[1]] [1] 1 [[2]] [1] 2 [[3]] [1] 3 [[4]] [1] 4 [[5]] [1] 5 [[6]] [1] 6 > > tail(lst4) [[1]] [1] 5 [[2]] [1] 6 [[3]] [1] 7 [[4]] [1] 8 [[5]] [1] 9 [[6]] [1] 10 |
また、次のように引数nを渡すことで何個目までを表示するか指定することができます。
1 2 3 4 5 6 7 8 9 | > head(lst4, 3) #位置を指定 [[1]] [1] 1 [[2]] [1] 2 [[3]] [1] 3 |
リストの名前(names)を参照したいときは、関数namesを用います。
関数namesの引数に名前を参照したいリストを渡すことで、リストの名前を参照することができます。
1 2 | > names(lst3) #名前 [1] "a" "b" "c" |
リストの要素の取得
リストの要素の取得方法を次に紹介する3つの方法に分けてみていきます。
この後の要素の変更でも触れますが、次の3つの方法で要素の取得が可能です。
- インデックスで指定する方法
- 名前で指定する方法
- 真偽値で指定する方法
3つの方法の利点とともに要素の取得の仕方を説明していきます。
インデックスで指定
まず、一番基本的なインデックスで指定する方法について見ていきます。
インデックスで指定して要素を取得する方法は以下の通りです。
- 1番目の要素を取得したいときは、lst[[1]]
- 1番目と3番目の要素を取得したいときは、lst[c(1, 3)]
- 2から4番目の要素を取得したいときは、lst[seq(2, 4)]
実行例にあるように、リストの後ろに大括弧[[index]]を付けることで、index番目の要素を取得することができます。
lst[c(1, 3)]のようにリストのインデックスを与えてあげると、リストの一部分を取得することができます。 一重の括弧[]で取得したときの戻り値はリストになることに注意が必要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | > #インデックスで取得 > lst1[[1]] #1番目の要素を取得 [1] 1 > > lst1[c(1, 2)] #1, 2番目の要素を取得 [[1]] [1] 1 [[2]] [1] 2 > > lst1[seq(2, 4)] #2から4番目の要素を取得 [[1]] [1] 2 [[2]] [1] 3 [[3]] [1] 4 |
インデックスで取得する方法は、例えばfor文でインデックスを繰り返したいときに用いられます。
また、単に1番目、2番目の要素を取得したいときにlst[[1]]、lst[[2]]と書いてもいいですが、マジックナンバーだらけになってしまいプログラミングコードの質的に良くないです。
数日たった後に何の解析をしていたのか分からなくなってしまうため、このようなインデックスで参照する方法を多用するのはお勧めしません。
リストに名前が与えられている場合は、この後に解説する「名前で取得する方法」と「真偽値で取得する方法」を使うことを推奨します。
名前で指定
次に名前で指定する方法を紹介します。
リストに名前(names)がある場合は名前を指定することで、その名前に対応する要素を取得することができます。
以下のようにして、名前でリストの要素を参照できます。
- 名前が"a"である要素を取得したいときは、lst$aまたはlst[["a"]]
- 名前が"b"、"c"である要素を取得したいときは、lst[c("b", "c")]
インデックスのときと同様に、大括弧の中に名前のリストを渡すことで複数を取得することができます。
1 2 3 4 5 6 7 8 9 10 11 12 | > #名前で取得 > lst3$a #名前が"a"である要素を取得 [1] 1 > > lst3[["a"]] #名前が"a"である要素を取得<br />[1] 1 > > lst3[c("a", "b")] #名前が"a", "b"である要素を取得 $a [1] 1 $b [1] 2 |
真偽値で指定
最後に真偽値で要素を取得する方法について見ていきます。
logical型のベクトルをリストの後ろの大括弧に渡すことで、TRUEに対応する要素からなるリストを取得することができます。
例えば、「numeric型のリストのうち10以上の部分リストを取得したい」というときに役立ちます。
- 10以上の部分リストを取得したいときは、lst[lst >= 10]
- 名前が"a"または"b"である部分リストを取得したいときは、lst[names(lst) == "a" | names(lst) == "b"]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | > #真偽値で取得 > vec_logical <- c(TRUE, TRUE, TRUE, FALSE, FALSE) > lst1[vec_logical] [[1]] [1] 1 [[2]] [1] 2 [[3]] [1] 3 > > lst1[lst1 >= 3] #3以上の要素を取得 [[1]] [1] 3 [[2]] [1] 4 [[3]] [1] 5 > > lst3[names(lst3) == "a" | names(lst3) == "b"] #名前が"a"である要素を取得 $a [1] 1 $b [1] 2 |
リストの要素の変更
続いてリストの要素の変更について解説します。
リストの要素の取得と同様に、変更はインデックス、名前、真偽値の3通りの方法があります。
それぞれの変更方法について見ていきます。
インデックスで指定
最初に一番基本的なインデックスで要素を変更する方法を紹介します。
「先頭または末尾を変更したい。または、先頭から10番目の要素を変更したい」というときに役立ちます。
- 1番目の要素を-1にしたいときは、lst[[1]] <- -1
- 2と3番目の要素をそれぞれ-2、-3にしたいときは、lst[c(2, 3)] <- list(-2, -3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | > #インデックスで変更 > lst1 [[1]] [1] 1 [[2]] [1] 2 [[3]] [1] 3 [[4]] [1] 4 [[5]] [1] 5 > > lst1[[1]] <- -1 #1番目の要素を-1に変更 > lst1 [[1]] [1] -1 [[2]] [1] 2 [[3]] [1] 3 [[4]] [1] 4 [[5]] [1] 5 > > lst1[c(2, 3)] <- list(-2, -3) #2, 3番目の要素-2, -3に変更 > lst1 [[1]] [1] -1 [[2]] [1] -2 [[3]] [1] -3 [[4]] [1] 4 [[5]] [1] 5 |
要素の取得で説明したように、先頭の要素の変更であれば問題ないですが、2番目や3番目の要素の変更などインデックスでの変更を多用するとコードの可読性が下がるためお勧めしません。
名前で指定
名前で要素を変更する例を紹介します。
リストに名前が与えられているときは、名前に対応する要素を変更することができます。
- 名前が"a"である要素を-1にしたいときは、lst$a <- -1またはlst[["a"]]
- 名前が"b"、"c"である要素をそれぞれ-2、-3にしたいときは、lst[c("b", "c")] <- list(-2, -3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | > #名前で変更 > lst3 $a [1] 1 $b [1] 2 $c [1] 3 > > lst3$a <- -1 #名前が"a"である要素を-1に変更 > lst3 $a [1] -1 $b [1] 2 $c [1] 3 > > lst3[c("b", "c")] <- list(-2, -3) #名前が"a", "b"である要素を-2, -3に変更 > lst3 $a [1] -1 $b [1] -2 $c [1] -3 |
真偽値で指定
真偽値での要素を変更は「10以上の要素をのみ変更したい」、「ある値に一致する要素を変更したい」ときに役立ちます。
下に示すような要素の変更ができます。
- 0である要素を-1に変更したいときは、lst[lst == 0] <- -1
- 3以上である要素を0に変更したいときは、lst[lst >= 6] <- 0
基本的な真偽値による変更方法は以下の通りです。logical型のベクトルをリストの大括弧の中に渡し、変更後の要素を代入します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | > #真偽値で変更 > lst1 [[1]] [1] -1 [[2]] [1] -2 [[3]] [1] -3 [[4]] [1] 4 [[5]] [1] 5 > vec_logical <- c(TRUE, TRUE, TRUE, FALSE, FALSE) > lst1[vec_logical] <- list(1, 2, 3) > > lst1 [[1]] [1] 1 [[2]] [1] 2 [[3]] [1] 3 [[4]] [1] 4 [[5]] [1] 5 |
以下、具体的な真偽値による変更例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |