アメリエフの技術ブログ

Amelieff Staff Blog

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つについて、特に使い分ける必要があるかはわかりませんが、それぞれの長所・短所を把握して、適切な場面でそれぞれを使うことができると解析が快適になると思います。