こんにちは、usagi-sanです。
今回は、R言語のベクトルやリストの操作を紹介していきます。
Rでは、ベクトルやリストなどのオブジェクトがありますが、これらのオブジェクトには他の言語に存在するメソッド(append、insert、removeなど)が存在しません。
特にリストのインデックスや要素数を取得する際、手間がかかります。
そんな手間を無くすために、他の言語で実装されているメソッドをR言語で行う方法を解説していきます。
また、リストなどのオブジェクトに対する関数(append、insert、removeなどの関数)をRで実装しました。
こんな方におすすめ
- ベクトルやリストの操作に困っている
- 挿入や削除したいけど、便利な関数が見当たらない
- ベクトルやリストの操作のテンプレが欲しい
ベクトルとリストの操作方法については次の記事で学べます。
【R言語】ベクトルの操作 作成・値の代入・要素の追加など
R言語のベクトルの操作(作成や参照、代入、要素の追加など)をまとめました。 この記事では以下のベクトルに関する操作を実行例付きで分かりやすく解説しています。 この記事で学べる事 ベクトルの作成 ベクト ...
続きを見る
【R言語】リストの操作 作成・値の代入・要素の追加など
R言語のリストの操作(作成や値の代入、要素の追加など)をまとめました。 この記事では以下のリストに関する操作を実行例とともに分かりやすく解説しています。 この記事で学べる事 リストの作成 リストの参照 ...
続きを見る
ベクトル・リストの操作一覧
他の言語に実装されているAppend、Extend、Insert、Remove、Pop、Index、Countの実行方法についてまとめました。
是非コピペして使ってください。
Append
2つのベクトル及びリストを連結させる方法について紹介します。Rにはappendという関数がありますが、リストに対しては少々不便です。そんなappendを使いやすくしてみました。
次の関数は、ベクトルとリストの両方に対してAppendを行うことができる関数です。
1 2 3 4 5 6 7 8 9 | append_vecOrList <- function(x, item) { if (!is.vector(x)) { stop("The Argument x must be a vector or list type object") } if (is.list(x) & !is.list(item)) { item <- list(item) } return(c(x, item)) } |
ポイント
関数append_vecOrListの引数を以下に示します。
x | ベクトルまたはリスト型のオブジェクト |
item | xに結合させるベクトルまたはリスト型のオフジェクト |
いくつか実行例を紹介します。
append_vecOrLIstを用いると、次のようにベクトルやリストを結合させることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | > append_vecOrList(c(1, 2, 3, 4, 5), c(6, 7)) [1] 1 2 3 4 5 6 7 > append_vecOrList(as.list(c(1, 2, 3, 4, 5)), c(6, 7, 8)) [[1]] [1] 1 [[2]] [1] 2 [[3]] [1] 3 [[4]] [1] 4 [[5]] [1] 5 [[6]] [1] 6 7 8 |
ベクトルにベクトルを結合させるときは、c(1, 2, 3, 4, 5, 6, 7)のように連結されますが、リストにベクトルを追加するときは最後の要素にc(6, 7, 8)という一つの要素が追加されます。
Extend
次に、ベクトルやリストを延長させる方法を紹介します。上のAppendとの違いは、あるリストに対してベクトルやリストを延長する際に、その要素が順に結合される点です。これに関しては、実行例で説明していきます。
次の関数を用いることで、ベクトルやリストをExtendすることができます。
1 2 3 4 5 6 | extend_vecOrList <- function(x, item) { if (!is.vector(x)) { stop("The Argument x must be a vector or list type object") } return(c(x, item)) } |
ポイント
関数extend_vecOrListの引数を以下に示します。
x | ベクトルまたはリスト型のオブジェクト |
item | xに併合させるベクトルまたはリスト型のオフジェクト |
実行例を以下に示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | > extend_vecOrList(c(1, 2, 3, 4), c(5, 6, 7)) [1] 1 2 3 4 5 6 7 > extend_vecOrList(as.list(c(1, 2, 3, 4)), c(5, 6, 7)) [[1]] [1] 1 [[2]] [1] 2 [[3]] [1] 3 [[4]] [1] 4 [[5]] [1] 5 [[6]] [1] 6 [[7]] [1] 7 |
ベクトルに対する操作は、append_vecOrListと全く同じですが、リストにベクトルやリストを併合させる場合、すべての要素が順に加わります。as.list(c(1, 2, 3, 4)), c(5, 6, 7)を併合させると、1から7の要素が1つずつ格納されたリストを取得することができます。
Insert
ベクトルやリストに対するInsertの方法について紹介します。ベクトルやリストの操作の際に、特定の位置にオブジェクトを追加したい場合があると思います。このような場合、Insertを用いるのが便利です。
次の関数を用いることで、Insertを行うことができます。
1 2 3 4 5 6 7 8 9 | insert_vecOrList <- function(x, i, item) { if (!is.vector(x)) { stop("The Argument x must be a vector or list type object") } if (is.list(x) & !is.list(item)) { item <- list(item) } return(c(x[seq_len(i - 1)], item, x[i : length(x)])) } |
ポイント
関数insert_vecOrListの引数を以下に示します。
x | ベクトルまたはリスト型のオブジェクト |
i | xにitemを挿入するインデックス |
item | xに挿入する要素 |
実行例を以下に示します。
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 | > insert_vecOrList(c(1, 2, 3, 4, 5), 3, 10) [1] 1 2 10 3 4 5 > insert_vecOrList(as.list(c(1, 2, 3, 4, 5)), 3, 10) [[1]] [1] 1 [[2]] [1] 2 [[3]] [1] 10 [[4]] [1] 3 [[5]] [1] 4 [[6]] [1] 5 > insert_vecOrList(as.list(c(1, 2, 3, 4, 5)), 3, c(10, 11, 12)) [[1]] [1] 1 [[2]] [1] 2 [[3]] [1] 10 11 12 [[4]] [1] 3 [[5]] [1] 4 [[6]] [1] 5 |
上の実行例のように指定したインデックス(例では3番目)にitemが挿入されているのが分かります。
ベクトルに対しては、xの3番目の要素の前に連続するようにitemの各要素が挿入されます。
リストに対しては、3番目の要素の前にitemが挿入されます。3つ目の例のように、リストにベクトルを挿入すると、3番目の要素にベクトルc(10, 11, 12)が挿入されているのが分かります。
Remove
ベクトルやリストに対して、Removeを行う方法を紹介します。ベクトルやリストのある要素を削除したい場合、Removeが必要になってくると思います。
Rにおいて、Removeは次のように作ることができます。
1 2 3 4 | remove_vecOrList <- function(x, item) { indices <- getIndex(x, item) return(x[- indices]) } |
ポイント
関数remove_vecOrListの引数を以下に示します。
x | ベクトルまたはリスト型のオブジェクト |
item | xから削除する要素 |
実行例を以下に示します。
1 2 3 4 5 6 7 8 9 10 11 12 | > remove_vecOrList(c(1, 2, 3, 4), 1) [1] 2 3 4 > remove_vecOrList(list(1, 2, 3, c(4, 5)), c(4, 5)) [[1]] [1] 1 [[2]] [1] 2 [[3]] [1] 3 |
ベクトルやリスト中の特定の要素に一致する要素を削除することができます。
また2つ目の例のように、list(1, 2, 3, c(4, 5))のようなベクトルを要素に持つリストに対しても、c(4, 5)というベクトルを削除することができます。
Pop
Popを行う方法を紹介します。Popは、ベクトルやリストのi番目のインデックスの要素を除いたベクトルまたはリストと、i番目の要素を取得したい場合に用います。
以下のように関数を与えることで、RでPopを行うことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | pop_vecOrList <- function(x, i) { if (!is.vector(x)) { stop("The Argument x must be a vector or list type object") } if (i < 1 | i > length(x)) { stop("The Argument i must greater than 1 and less than the length of x") } if (i + 1 <= length(x)) { poppedX <- c(x[seq_len(i - 1)], x[(i + 1) : length(x)]) } else { poppedX <- x[seq_len(i - 1)] } return(list(poppedX = poppedX, xi = x[i])) } |
ポイント
関数pop_vecOrListの引数を以下に示します。
x | ベクトルまたはリスト型のオブジェクト |
i | xから除きたい要素のインデックス |
この間数の実行例を以下に示します。
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 | > pop_vecOrList(c(1, 2, 3, 4, 5), 3) $poppedX [1] 1 2 4 5 $xi [1] 3 > pop_vecOrList(as.list(c(1, 2, 3, 4, 5)), 3) $poppedX $poppedX[[1]] [1] 1 $poppedX[[2]] [1] 2 $poppedX[[3]] [1] 4 $poppedX[[4]] [1] 5 $xi $xi[[1]] [1] 3 |
指定したインデックスの要素とその要素を除いたオブジェクトを返しているのが分かります。poppedXにはi番目の要素を除いたオブジェクト、xiにi番目の要素が格納されます。
Index
次に、ベクトルやリスト中のある要素のインデックスを取得する方法について解説します。ある列名に対応する番号を取得するときに、Indexが必要になります。
Rにおいて、Indexは次のように表現することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | getIndex <- function(x, item) { if (!is.vector(x)) { stop("The Argument x must be a vector or list type object") } if (is.list(x)) { isItem <- unlist(lapply(x, function(y) { return(all(y == item)) })) return(seq_len(length(isItem))[isItem]) } else { names(x) <- seq_len(length(x)) return(as.numeric(names(x[x == item]))) } } |
ポイント
getIndexの引数を以下に示します。
x | ベクトルまたはリスト型のオブジェクト |
item | インデックスを取得するxの要素 |
実行例を以下に示します。
1 2 3 4 5 6 7 8 | > getIndex(c(1, 2, 3, 4, 5), 3) [1] 3 > getIndex(c(1, 3, 3, 3, 5), 3) [1] 2 3 4 > getIndex(list(1, 2, 3, c(4, 5)), c(4, 5)) [1] 4 |
ベクトルやリストに対してitemのインデックスを取得できているのが分かります。
2つ目の実行例のように複数のインデックスにも対応しています。
また、3つ目の実行例のようにlist(1, 2, 3, c(4, 5))中のc(4, 5)のインデックスも適切に取得できます。
Count
最後に、Countを実装する方法を解説します。ある要素がベクトルやリスト中に何個あるかを知りたいときに、Countが必要になります。
次のように、Countは先ほどのIndexを用いて表現することが可能です。
1 2 3 | getCount <- function(x, item) { return(length(getIndex(x, item))) } |
ポイント
getCountの引数を次に示します。
x | ベクトルまたはリスト型のオブジェクト。 |
item | x中の要素。itemに一致するx中の要素数を返す。 |
実行例を以下に示します。
1 2 3 4 5 6 7 8 | > getCount(c(1, 2, 3, 4, 5), 3) [1] 1 > getCount(c(1, 3, 3, 3, 5), 3) [1] 3 > getCount(list(1, 2, 3, c(4, 5)), c(4, 5)) [1] 1 |
ベクトルやリスト中のitemの個数を適切に取得できているのが分かります。
ダウンロード方法
上で紹介した関数は次の記事に書いてあるパッケージUsagiSanをインストールすることで使うことができます。
R言語 自作パッケージ UsagiSan
こんにちは、usagi-sanです。 R言語の自作パッケージを紹介します。 統計解析のアルバイトをしている中、暇な時間を見つけて自分でパッケージを作ってみました。 Rのパッケージには、統計解析用のパッ ...
続きを見る
また、次のダウンロードリンクから今回紹介した関数を含むスクリプトファイルをダウンロードすることもできます。