Rの%in%演算子とかmatch関数とか
Rで私がよく使う%in%
という演算子の話をします。
正式な名前は何なんでしょう。説明しにくいので正式名称を知りたいです。
%in%
はRの二項演算子の一つで、与えられた2つのベクトルを比較し、左辺のベクトルの要素が右辺のベクトルの要素とマッチしているかを判断し、TRUE
/FALSE
の論理値で返してくれる演算子です。
ちなみに、Rで関数などのヘルプメッセージを呼び出すときはhelp
関数を使いますが、この%in%
のような演算子のヘルプメッセージを呼び出したいときはバッククオートで囲み、ヘルプを呼び出します。豆知識です。
help(`%in%`)
例として下記の2つのベクトルがあるとします。memo
が買い物に行く前に用意したお買い物リスト、receipt
が買い物をした後にもらったレシートに記載されていた商品名だとします。
memo <- c("milk", "sausage", "potato", "egg", "spinach") receipt <- c("egg", "sausage", "potato", "milk")
買い忘れがないか、2つのベクトルを比べて見たいのですが、お店のレジ係さんは当然、買い物かごから買い物リスト順に商品をレジに通してくれるわけではなので、2つのベクトルの順番はバラバラで、見比べるのも面倒です。
さて、そこで%in%
を使ってみましょう。
memo %in% receipt
[1] TRUE TRUE TRUE TRUE FALSE
左辺memo
と同じ長さのベクトルが返ります。
左辺memo
のベクトルのうち、1~4つめの要素は右辺receipt
とマッチしていたためTRUE
、5つ目の要素はreceipt
の要素とマッチしなかったため、FALSE
が返りました。具体的にどの要素がマッチしていたのかを確認してみましょう。
memo[memo %in% receipt]
[1] "milk" "sausage" "potato" "egg"
論理値を否定して、マッチしていなかった要素(買い忘れたもの)も確認できます。
memo[! memo %in% receipt]
[1] "spinach"
買い物をした人は、買い物メモに書かれていたホウレン草を買い忘れたようです。嫌いだったのでわざと忘れたのかもしれませんね。
なお、%in%
演算子のヘルプページによると、%in%
の中身は、match
関数でできているので、match
関数でも同じようなことができます。
match(memo, receipt)
[1] 4 2 3 1 NA
match
関数は、第一引数の要素の内、マッチした要素が第二引き数で何番目の要素なのか(インデックス)も教えてくれます。また、その他にもいくつかの設定が可能です。
以上、%in%
とmatch
関数の紹介でした。
個人的には、二項演算子%in%
のほうが直感的で使いやすいと思っていますが、match
関数のほうインデックスが返ってくるなど、%in%
よりも使いやすい面があります。
この2つについて、特に使い分ける必要があるかはわかりませんが、それぞれの長所・短所を把握して、適切な場面でそれぞれを使うことができると解析が快適になると思います。
アメリエフでは、バイオデータ解析やそのシステム・インフラ環境の開発に興味のあるエンジニア・リーダー候補を募集しています。
www.wantedly.com