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 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 | > lst1 [[1]] [1] -1 [[2]] [1] -2 [[3]] [1] -3 [[4]] [1] 4 [[5]] [1] 5 > > lst1[lst1 == 5] <- -5 #5である要素を変更 > lst1 [[1]] [1] -1 [[2]] [1] -2 [[3]] [1] -3 [[4]] [1] 4 [[5]] [1] -5 > > lst1[lst1 >= 3] <- 0 #3以上の要素を変更 > lst1 [[1]] [1] -1 [[2]] [1] -2 [[3]] [1] -3 [[4]] [1] 0 [[5]] [1] -5 |
リストの名前の付与・変更
次にリストの名前の与え方と変更の仕方について紹介します。
名前の付与
リストに名前を付けたいときは次のように関数namesを使う方法と、関数listでリストを宣言する際に直接名前を与える方法があります。
例えば、リストlistの名前をc("a", "b", "c", "d", "e")にしたいときは次のようにします。
- names(lst) <- c("a", "b", "c", "d", "e")
- lst <- list(a = 1, b = 2, c = 3, d = 4, e = 5)
関数namesを使ったリストの名前の付与の方法は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | > #名前の付与 > lst1 <- list(1, 2, 3, 4, 5) > names(lst1) <- letters[seq_len(5)] > > lst1 $a [1] 1 $b [1] 2 $c [1] 3 $d [1] 4 $e [1] 5 |
関数listで与える方法を使う場合、19行目のように""で囲んでいないと+や-などの特殊文字を使うことができないのに注意が必要です。
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 | > lst1 <- list(a = 1, b = 2, c = 3, d = 4, e = 5) > lst1 $a [1] 1 $b [1] 2 $c [1] 3 $d [1] 4 $e [1] 5 > > lst1 <- list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5) > lst1 $a [1] 1 $b [1] 2 $c [1] 3 $d [1] 4 $e [1] 5 |
名前の変更
次にリストの名前の変更方法を紹介します。
リストの変更はインデックスによる方法と名前(真偽値)による方法があります。
インデックスで指定
下の実行例に示すように、リストの要素の変更と同様に、変更したい名前に対応するインデックスを用いて変更することができます。
- 1番目の名前を"A"にしたいときは、names(lst)[1] <- "A"
- 2と3番目の名前を"B"、"C"にしたいときは、names(lst)[c(2, 3)] <- c("B", "C")
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | > #インデックスで変更 > names(lst3)[1] <- "A" #1番目の名前の変更 > lst3 $A [1] -1 $b [1] -2 $c [1] -3 > > names(lst3)[c(2, 3)] <- c("B", "C") #1番目の名前の変更 > lst3 $A [1] -1 $B [1] -2 $C [1] -3 |
名前で指定(真偽値で指定)
次に名前で指定してリストの名前を変更する方法を紹介します。
先頭から5番目の名前を変更するよりは、名前で指定して変更する方がより自然で可読性の高いコードを書くことができます。
次のようにある名前に一致するような条件(真偽値)を大括弧に渡すことで名前を変更することができます。
- 名前"A"の要素を"a"に変更したいときは、names(lst)[names(lst) == "A"] <- "a"
- 名前"B"と"C"の要素をそれぞれ"b"と"c"に変更したいときは、names(lst)[names(lst) %in% c("B", "C")] <- c("b", "c")
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | > #名前で変更(真偽値で変更) > names(lst3)[names(lst3) == "A"] <- "a" #名前"A"を変更 > lst3 $a [1] -1 $B [1] -2 $C [1] -3 > > names(lst3)[names(lst3) %in% c("B", "C")] <- c("b", "c") #名前"B"と"C"を変更 > lst3 $a [1] -1 $b [1] -2 $c [1] -3 |
リストの要素の追加・削除
次に、リストの要素の追加と削除の仕方について見ていきます。
インデックスと名前、真偽値で追加と削除する例を紹介します。
インデックスで指定
まずインデックスで要素を追加・削除する方法について見ています。
例えば、10番目にある要素を追加したい、または削除したい場合によく用います。
インデックスで追加・削除する方法は以下の通りです。
- 11番目に11を追加したいときは、vec[11] <- 11
- リストの末尾に12を追加したいときは、vec[length(vec) + 1] <- 12
- 11番目の要素の削除したいときは、vec <- vec[-11]
リストの大括弧に追加したい位置を表すインデックスを渡し、そこに追加する要素を代入します。
また、マイナスのインデックスを渡すと、その位置の要素を削除することができます。
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 55 56 57 58 59 60 61 62 | > #インデックスで追加・削除 > lst1[[6]] <- 6 #6番目に追加 > lst1 $a [1] 1 $b [1] 2 $c [1] 3 $d [1] 4 $e [1] 5 [[6]] [1] 6 > > lst1[[length(lst1) + 1]] <- 7 #新しい要素を追加 > lst1 $a [1] 1 $b [1] 2 $c [1] 3 $d [1] 4 $e [1] 5 [[6]] [1] 6 [[7]] [1] 7 > > lst1 <- lst1[-c(6, 7)] #6と7行目の削除 > lst1 $a [1] 1 $b [1] 2 $c [1] 3 $d [1] 4 $e [1] 5 |
また、関数cを使うことで指定したインデックス以降に要素またはリストを追加することが可能です。
これにより、リストの先頭に要素を追加することができます。
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 | > lst1 <- c(0, lst1) #先頭に要素を追加 > lst1 [[1]] [1] 0 $a [1] 1 $b [1] 2 $c [1] 3 $d [1] 4 $e [1] 5 > > lst1 <- c(lst1[seq(1, 3)], 10, lst1[seq(4, length(lst1))]) #3番目と4番目の間に要素を挿入 > lst1 [[1]] [1] 0 $a [1] 1 $b [1] 2 [[4]] [1] 10 $c [1] 3 $d [1] 4 $e [1] 5 |
名前で指定
続いて、リストの名前で追加または削除する方法を紹介します。
次のように追加する要素の名前の指定や、名前に対応する要素を削除することができます。
- 名前が"d"である要素4を追加したいときは、lst["d"] <- 4
- 名前が"e"と"f"である要素5と6を追加したいときは、lst[c("e", "f")] <- list(5, 6)
- 名前が"d"、"e"、"f"である要素を削除したいときは、lst <- subset(lst, subset = !(names(lst) %in% c("d", "e", "f")))
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 | > #名前で追加・削除 > lst3$d <- 4 #名前が"d"である要素4を追加 > lst3 $a [1] -1 $b [1] -2 $c [1] -3 $d [1] 4 > > lst3[c("e", "f")] <- list(5, 6) #名前が"e", "f"である要素5, 6を追加 > lst3 $a [1] -1 $b [1] -2 $c [1] -3 $d [1] 4 $e [1] 5 $f [1] 6 > > lst3 <- subset(lst3, subset = !(names(lst3) %in% c("d", "e", "f"))) #名前が"d","e", "f"の要素を削除 > lst3 $a [1] -1 $b [1] -2 $c [1] -3 |
真偽値で指定
最後に真偽値で指定し、リストの要素を削除する方法を紹介します。
こちらについては、削除のみの解説となります。
リストの特定の要素を削除したいときは次のように実行します。
削除したい要素以外がTRUEとなるような真偽値のベクトルをリストの大括弧に渡し、リストを更新することで削除することができます。
- 5の要素を削除したいときは、lst <- lst[lst != 5]
- 3以上の要素を削除したいときは、lst <- lst[lst < 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 | > lst1 [[1]] [1] 0 $a [1] 1 $b [1] 2 [[4]] [1] 10 $c [1] 3 $d [1] 4 $e [1] 5 > > #真偽値で削除 > lst1 <- lst1[lst1 != 0] #0の要素を削除 > lst1 $a [1] 1 $b [1] 2 [[3]] [1] 10 $c [1] 3 $d [1] 4 $e [1] 5 > > lst1 <- lst1[lst1 < 3] #3以上の要素を削除 > lst1 $a [1] 1 $b [1] 2 |