HOWTO · R

R で行番号を検索

このチュートリアルでは、R の値の行番号を見つける方法を示します。

このページの内容

条件に合うすべての行の位置を調べるには which() を、指定した各値の最初の位置を調べるには match() を使います。たとえば、which(staff$role == "Senior Dev") は staff 内で条件に一致する各行の位置を返します。条件に一致する行がない場合、which() の戻り値は integer(0) です。match() では、検索値が見つからないと NA が返ります。

論理条件や検索対象のベクトルがデータフレームと同じ行順なら、返される位置を行番号として使えます。通常の R のデータフレームでは、行位置は 1 から始まります。行番号ではなく行ラベルが必要な場合は、rownames(data) と比較するか、match() で検索してください。

which() で行番号を調べる

which() は論理ベクトルを受け取り、値が TRUE である位置を返します。データフレームの列に比較条件を適用すると論理ベクトルができるため、返された位置はデータフレームと同じ順序の行を示します。一致するものをすべて返すので、複数の行が条件に合う場合に適しています。

次の例を実行します。

staff <- data.frame(
  name = c("Ari", "Bea", "Chen", "Devi"),
  role = c("Analyst", "Senior Dev", "Senior Dev", "Manager")
)
which(staff$role == "Senior Dev")

結果に位置 2 と 3 が含まれるのは、どちらの行も同じ役割だからです。数値条件や複数の条件で行を探す場合は、論理式を変更します。たとえば、which(grades$Math > 80) は Math の値が 80 を超えるすべての行を選びます。返された位置を別のオブジェクトの部分集合を作るために使う場合は、データフレームの行順が同じであることを確認してください。

独自の行名で検索するには、rownames() が返すラベルを比較します。例にある「central」などの値は英語のまま表示されています。

people <- data.frame(name = c("Ari", "Bea", "Chen"))
rownames(people) <- c("north", "central", "south")
which(rownames(people) == "central")

この式は、ラベルが central の行の位置を返します。ラベルそのものは行番号ではありません。行と一対一に対応するベクトルがある場合は、which(values == target) も同じように使えます。単独のベクトルに対する結果は「位置」と呼び、そのベクトルがデータフレームの行に対応している場合に限り「行番号」と考えてください。

比較結果に欠損値が含まれていても、which() はその位置を返しません。欠損値を条件として扱いたい場合は、which() を呼び出す前に論理式の中で明示的に処理してください。

match() で値の最初の位置を調べる

ベクトル、列、行名ベクトルにある値の最初の位置を調べるには、match(query, table) を使います。query には値を 1 つでも複数でも指定でき、結果には検索値ごとに 1 つの位置が含まれます。which() と異なり、match() は各検索値について最初に見つかった位置だけを返します。table にない検索値には、既定で NA が返ります。

データフレームの列を検索する場合は、探す値を先に、列を後に指定します。

staff <- data.frame(
  role = c("Analyst", "Senior Dev", "Senior Dev", "Manager")
)
match("Senior Dev", staff$role)

返される位置は 2 です。値が後の行にも現れていても、最初に一致した行の位置が返ります。ベクトルにも同じ形式を使えます。match(78, grades) は 78 が最初に現れる位置を返します。行ラベルの位置を得るには、match("central", rownames(people)) を使います。例にある「central」などの値は英語のまま表示されています。

複数の検索値をベクトルで渡すと、それぞれの位置を取得できます。

grades <- c(88, 90, 75, 94, 80)
match(c(75, 94, 70), grades)

結果には 75 と 94 の位置がこの順で並び、その後に 70 の検索結果として NA が続きます。位置はテーブル内の順序ではなく、検索値の順序で返されます。テーブルに重複値がある場合も、各検索値に対して最初に現れる位置が返ります。検索値が見つからないときは、その位置を使って別のオブジェクトを部分集合にする前に NA を確認してください。

まとめ

条件に一致する行が複数ある可能性があり、すべての位置が必要なら which() を選びます。一致がなければ integer(0) を返します。1 つ以上の値を検索し、それぞれについて最初の位置が必要なら match() を選びます。見つからない値には NA が返ります。どちらの関数でも、検索対象のベクトルがデータフレームと同じ行順の場合に限り、位置をデータフレームの行番号として扱えます。位置ではなく行ラベルが必要なら rownames() を使ってください。