HOWTO · R

R ベクトルの要素のインデックスを求める

このチュートリアルでは、R ベクトルの要素のインデックスを見つける方法を説明します。

このページの内容

条件がTRUEになる位置をすべて取得するには which() を使います。検索した値ごとに最初の位置だけが必要なら match() を使い、一致する値がない場合は NA が返ります。Rのベクトル位置は1から始まります。以下では同じベクトルを使って、2つの結果を比較します。

which()ですべての一致位置を取得する

which() は論理値ベクトルを受け取り、TRUE になっている要素の位置を返します。ベクトルを1つの値と比較すると、その値が複数回現れる場合は一致する位置も複数返ります。複数の値のいずれかを検索するには、%in% で所属判定の論理値ベクトルを作り、それを which() に渡します。

次の例では、20 が現れるすべての位置と、値が 10 または 30 である要素の位置を求めます。

このセクションのコードと表示されるラベルや出力は英語のままです。

x <- c(10, 20, 10, 30, 20)
which(x == 20)
which(x %in% c(10, 30))
[1] 2 5
[1] 1 3 4

最初の結果には 20 が現れる位置の両方が含まれ、2つ目の結果には値が 10 または 30 の要素の位置が並びます。Rのベクトル添字と同様に、位置は1から始まります。

%in% は左側のベクトルの各要素に対して論理値を1つ返す演算子であり、which() の引数ではありません。x > 15 のような条件でも検索できます。その論理式を作成して which() に渡すと、条件を満たす位置が得られます。which() が返すのは TRUE に対応する位置だけなので、欠損した論理値は結果に含まれません。

コード例と表示出力は英語のままです。出力に表示ラベルがある場合も、ラベルは英語のままです。

match()で各値の最初の一致位置を取得する

match(needles, haystack) は、needles の各値について haystack 内で最初に一致する位置を探します。引数の順序が重要です。検索する値を先に、検索対象のベクトルを後に指定します。検索対象に同じ値が複数あっても、同じ値に対して位置が重複して返されることはありません。各検索値につき結果は最大1つです。検索値が見つからない場合、既定では match() は NA を返します。

前の節の x ベクトルを使う次の式は、20 と 30 が最初に現れる位置を求め、40 は見つからないことを示します。

このセクションのコードと表示されるラベルや出力は英語のままです。

x <- c(10, 20, 10, 30, 20)
match(c(20, 30, 40), x)
[1]  2  4 NA

結果は 20、30、40 の順に対応します。20 は位置2に最初に現れ、30 は位置4に最初に現れます。40 は存在しないため、結果は NA です。

必要な結果に応じて関数を選びます。which(x == value) は一致する位置をすべて返せますが、match(value, x) が返すのは最初の位置だけです。複数の値を検索する場合、which(x %in% values) は検索対象のベクトル内での位置を返します。一方、match(values, x) は values の順序を保ち、検索値ごとに最初の一致位置を1つ返します。どちらの関数もベクトル自体は変更しません。位置を使って別のベクトルから要素を取り出す場合、match() で一致しなかった値の結果は NA になる点に注意してください。一致しない値を除外するなら、位置を使う前に !is.na(position) で確認します。返された位置は検索対象のベクトルに対するものなので、関連データに適用するときは、そのベクトルの順序を考慮してください。

コード例と表示出力は英語のままです。出力に表示ラベルがある場合も、ラベルは英語のままです。