R でベクトルの値のマッチ

r
R でベクトルの値のマッチをする方法です。
Author

Maple

Published

2025-09-01

Modified

2025-09-01

R でベクトルの値のマッチをする方法です。 何かと使うことが多いです。

match() 関数と %in% 演算子を使う方法があります。

簡単にまとめると以下の違いがあります:

それぞれについて、使い方を見ていきます。

match() 関数

基本的な使い方

match() 関数は、あるベクトルの各要素が別のベクトルのどの位置にあるかを返します。 match(x, table) の形式で使用します。 x は検索するベクトル、table は参照するベクトルです。

例として、ベクトル A の各要素がベクトル B のどの位置にあるかを調べます。

A <- c("apple", "banana", "cherry")
B <- c("banana", "cherry", "peech", "pear", "apple")
match(A, B)
[1] 5 1 2

ここでは、A の1番目の要素 “apple” は B の5番目に、2番目の要素 “banana” は1番目に、3番目の要素 “cherry” は2番目にあるため、結果は 5 1 2 となります。 つまり、戻り値の長さは A と同じになります。


参照先に複数のマッチする要素がある場合、最初に見つかった位置が返されます。

A <- c("apple", "banana", "cherry")
B <- c("banana", "cherry", "apple", "pear", "apple")
match(A, B)
[1] 3 1 2

この場合、“apple” は B の3番目と5番目に存在しますが、3番目の方が先のため、結果は 3 1 2 となります。


逆に、A に重複がある場合は、それぞれの要素に対してマッチングが行われます。

A <- c("apple", "banana", "apple")
B <- c("banana", "cherry", "apple", "pear", "apple")
match(A, B)
[1] 3 1 3

この場合、A の1番目と3番目の “apple” は B の3番目にマッチするため、結果は 3 1 3 となります。


もし A の要素が B に存在しない場合、NA が返されます。

A <- c("apple", "banana", "orange")
B <- c("banana", "cherry", "apple", "pear", "apple")
match(A, B)
[1]  3  1 NA

この場合、“orange” は B に存在しないため、結果は 3 1 NA となります。

応用例

データフレームでデータを結合する

match() 関数は、データフレームの結合にもよく使われます。

例えば、ある果物のリストがあって、果物別の価格表がある場合、match() を使って価格を対応させることができます。

果物は以下の3つです。

fruits <- data.frame(
  name = c("apple", "banana", "cherry"),
  stringsAsFactors = FALSE
)
fruits
    name
1  apple
2 banana
3 cherry

価格表は

prices <- data.frame(
  name = c("banana", "cherry", "apple", "pear"),
  price = c(100, 150, 200, 250),
  stringsAsFactors = FALSE
)
prices
    name price
1 banana   100
2 cherry   150
3  apple   200
4   pear   250

fruits に 新しくprice 列を追加します。 ここで、match() 関数でfruits$nameprices$name のどの位置にあるかを調べ、その位置を使って prices$price から価格を取得します。

idx <- match(fruits$name, prices$name)
fruits$price <- prices$price[idx]
fruits
    name price
1  apple   200
2 banana   100
3 cherry   150

これにより、fruits データフレームに対応する価格の列が追加されました。 今回はデータが少なかったですが、参照先がとても大きな場合、別のサブセットデータと結合するのに便利です。

ベクトルの並び順を変える

match() 関数は、ベクトルの並び順を別のベクトルに合わせるのにも使えます。 例えば、以下のように AB という2つのベクトルがあるとします。

A <- c("apple", "banana", "cherry")
B <- c("banana", "cherry", "apple", "pear", "apple")

A の並び順を B に合わせたい場合、match() を使ってインデックスを取得し、そのインデックスを使って A を並び替えます。

idx <- match(A, B) # 3 1 2
A_ordered <- A[idx]
A_ordered
[1] "cherry" "apple"  "banana"

これにより、A の並び順が、B での登場順番と揃います。

%in% 演算子

基本的な使い方

%in% 演算子は、あるベクトルの各要素が別のベクトルに存在するかどうかを論理値で返します。 よく順番がどっちなのか分からなくなるので注意してください。 AB の in かどうかのチェックと覚えます。

A <- c("apple", "banana", "orange")
B <- c("banana", "cherry", "peech", "pear", "apple")
A %in% B
[1]  TRUE  TRUE FALSE

この場合、A の “apple” と “banana” は B に存在するため TRUE、“orange” は存在しないため FALSE となり、結果は TRUE TRUE FALSE となります。 順番については問われず、存在すれば TRUE になります。

応用例

%in% 演算子は、データフレームのフィルタリングなどにもよく使われます。

以下のようなデータフレームがあるとします。

df <- data.frame(
  fruit = c("apple", "banana", "cherry", "pear", "apple"),
  price = c(150, 100, 200, 120, 160)
)
df
   fruit price
1  apple   150
2 banana   100
3 cherry   200
4   pear   120
5  apple   160

ここから、特定の果物だけを抽出したい場合、%in% 演算子を使ってフィルタリングできます。

selected_fruits <- c("apple", "cherry")
filtered_df <- df[df$fruit %in% selected_fruits, ]
filtered_df
   fruit price
1  apple   150
3 cherry   200
5  apple   160

ここでは、“apple” と “cherry” の行だけが抽出されます。

逆に、特定の果物を除外したい場合も同様に %in%! を使います。

exclude_fruits <- c("apple", "cherry")
excluded_df <- df[!df$fruit %in% exclude_fruits, ]
excluded_df
   fruit price
2 banana   100
4   pear   120

これにより、“apple” と “cherry” を除外した行だけが抽出されます。

まとめ

  • match() 関数は、ベクトルの各要素が別のベクトルのどの位置にあるかを返します。位置を知りたい場合に便利です。
  • %in% 演算子は、ベクトルの各要素が別のベクトルに存在するかどうかを論理値で返します。存在確認に便利です。
  • どちらもデータ操作やフィルタリングに頻繁に使用されるため、使い分けを理解しておくと便利です。

個人的には %in% 演算子の方がよく使う気がします。 最初に %in% 演算子を見たとき、%に挟まれている奇妙な記法に戸惑いましたが、使い方を覚えたら、便利で感動した思い出があります。

なお、読み方はいまだに分かりません。 「パーセント イン パーセント」 と読んでいます。