Rには、要素x
とベクトルがありv
ます。v
に等しい要素の最初のインデックスを見つけたいx
。これを行う1つの方法は次のとおりですwhich(x == v)[[1]]
。しかし、それは非常に非効率的です。それを行うためのより直接的な方法はありますか?
x
ボーナスポイントについては、がベクトルの場合に機能する機能はありますか?つまり、の各要素の位置を示すインデックスのベクトルを返す必要がありx
ますv
。
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%
最初の引数と同じ長さの論理ベクトルを返します。TRUE
その値が2番目の引数にあるFALSE
場合は、それ以外の場合はを返します。
Position
funprog{base}の関数もその役割を果たします。これにより、任意の関数を渡すことができ、最初または最後の一致を返します。
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]]
はい、次のようにベクトル内の要素のインデックスを見つけることができます。
> a <- c(3, 2, -7, -3, 5, 2)
> b <- (a==-7) # this will output a TRUE/FALSE vector
> c <- which(a==-7) # this will give you numerical value
> a
[1] 3 2 -7 -3 5 2
> b
[1] FALSE FALSE TRUE FALSE FALSE FALSE
> c
[1] 3
これは、ベクトル内の要素のインデックスを見つける最も効率的な方法の1つです。