A <- c("apple", "banana", "cherry")
B <- c("banana", "cherry", "peech", "pear", "apple")
match(A, B)[1] 5 1 2
Maple
2025-09-01
2025-09-01
R でベクトルの値のマッチをする方法です。 何かと使うことが多いです。
match() 関数と %in% 演算子を使う方法があります。
簡単にまとめると以下の違いがあります:
match() は位置を数字で返す%in% は存在するかどうかを論理値で返すそれぞれについて、使い方を見ていきます。
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 に重複がある場合は、それぞれの要素に対してマッチングが行われます。
[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$name が prices$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() 関数は、ベクトルの並び順を別のベクトルに合わせるのにも使えます。 例えば、以下のように A と B という2つのベクトルがあるとします。
A の並び順を B に合わせたい場合、match() を使ってインデックスを取得し、そのインデックスを使って A を並び替えます。
idx <- match(A, B) # 3 1 2
A_ordered <- A[idx]
A_ordered[1] "cherry" "apple" "banana"
これにより、A の並び順が、B での登場順番と揃います。
%in% 演算子は、あるベクトルの各要素が別のベクトルに存在するかどうかを論理値で返します。 よく順番がどっちなのか分からなくなるので注意してください。 A が B の in かどうかのチェックと覚えます。
[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% 演算子を見たとき、%に挟まれている奇妙な記法に戸惑いましたが、使い方を覚えたら、便利で感動した思い出があります。
なお、読み方はいまだに分かりません。 「パーセント イン パーセント」 と読んでいます。