web-dev-qa-db-ja.com

ベクトル内の要素のインデックスを見つけるためのR関数はありますか?

Rでは、要素xとベクトルvがあります。 vの中でxと等しい要素の最初のインデックスを見つけたい。これを行う1つの方法がwhich(x == v)[[1]]であることを私は知っていますが、それは過度に非効率的に見えます。もっと直接的な方法はありますか?

ボーナスポイントの場合、xがベクトルの場合に機能する関数はありますか?つまり、x内のvの各要素の位置を示すインデックスのベクトルを返す必要があります。

266
Ryan Thompson

関数matchはベクトルに対して機能します。

x <- sample(1:10)
x
# [1]  4  5  9  3  8  1  6 10  7  2
match(c(4,8),x)
# [1] 1 5

matchはあなたが要求したように、マッチの最初の出会いだけを返します。最初の引数の値のうち、2番目の引数の位置を返します。

複数一致の場合は、%in%が有効な方法です。

x <- sample(1:4,10,replace=TRUE)
x
# [1] 3 4 3 3 2 3 1 1 2 2
which(x %in% c(2,4))
# [1]  2  5  9 10

%in%は、最初の引数と同じ長さの論理ベクトルを返します。その値が2番目の引数で見つかる場合はTRUE、それ以外の場合はFALSEを返します。

371
Joris Meys

funprog {base}の関数Positionもその役割を果たします。それはあなたが任意の関数を渡すことを可能にし、最初または最後のマッチを返します。

Position(f, x, right = FALSE, nomatch = NA_integer)

22
pedroteixeira

上記の方法の効率に関するちょっとしたメモ:

 library(microbenchmark)

  microbenchmark(
    which("Feb" == month.abb)[[1]],
    which(month.abb %in% "Feb"))

  Unit: nanoseconds
   min     lq    mean median     uq  max neval
   891  979.0 1098.00   1031 1135.5 3693   100
   1052 1175.5 1339.74   1235 1390.0 7399  100

だから、最高のものは

    which("Feb" == month.abb)[[1]]
7
andrii