Rでは、要素x
とベクトルv
があります。 v
の中でx
と等しい要素の最初のインデックスを見つけたい。これを行う1つの方法がwhich(x == v)[[1]]
であることを私は知っていますが、それは過度に非効率的に見えます。もっと直接的な方法はありますか?
ボーナスポイントの場合、x
がベクトルの場合に機能する関数はありますか?つまり、x
内のv
の各要素の位置を示すインデックスのベクトルを返す必要があります。
関数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
を返します。
funprog {base}の関数Position
もその役割を果たします。それはあなたが任意の関数を渡すことを可能にし、最初または最後のマッチを返します。
Position(f, x, right = FALSE, nomatch = NA_integer)
上記の方法の効率に関するちょっとしたメモ:
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]]