2011-04-07 7 views
196

Rにおいて、Iは、要素xおよびベクトルvを有する。私は、vの要素の最初のインデックスがxに等しくなるようにしたいと考えています。私はこれを行う一つの方法は:which(x == v)[[1]]ですが、それはあまりにも非効率的だと思います。もっと直接的な方法がありますか?ベクトルの要素のインデックスを見つけるためのR関数はありますか?

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

+0

Rはベクトルで動作するように最適化されているため、which(x == v)[[1]] 'は非常に非効率的ではありません。これは、すべてのベクトル要素に適用される1つの比較演算子( '==')と、インデックス上の1つのサブセット化( 'which')です。それでおしまい。この機能で10.000の繰り返しを実行していない限り、関連するものはありません。 'match'や' Position'のような他の解決策は、 'which'と同じくらい多くのデータを返すことはできませんが、必ずしも効率的ではありません。 – BurninLeo

+1

私の質問では、xに対してベクトル化された関数が好きで、 'which(x == v)[[1]]'はそうではないと指定しました。 –

答えて

279

機能ベクトルの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%が移動するための方法である:その値が第2の引数とFALSEに見出すことができれば

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であれば、最初の引数として論理ベクトルを返しますさもないと。

+0

私は、matchと%in%の両方を持つc(2,3,3)とc(1,2,3,4)の例は、例の間の変更が少なくても有益であると思います。より長い最初のベクトルを必要とせずに、(c(2,3:3)、c(1:4)の)c(2,3,3)例から多くの変更があります。また、マッチしないものを非常に異なる方法で処理することにも注意する価値があります。 – John

+1

@ジョン:それはすべて本当ですが、それはOPが尋ねたものではありません。 OPは長いベクトルから始めて、別の要素に与えられた要素の最初の一致を見つけるように頼んだ。完全性のために、私はあなたがすべてのインデックスに興味があるならば、あなたはどちらを使うべきか(%in%)と付け加えました。ところで、あなたの答えを削除する理由はありません。それは有効な情報です。 –

+0

有効な情報ですが、削除されました...:) – John

19

funprog {base}の関数Positionも同じです。任意の関数を渡すことができ、最初または最後のマッチを返します。

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

3

Rは、ベクトル干し草の山で針の指標を求める方法との二重等号==演算子をオーバーロードしています。干し草の各マッチに対してTRUEの値を含むlogicalベクターが得られます。

例:

haystack <- c(1, 2, 4, 3, 4) 
needle <- 4 
indices <- needle == haystack 
indices 
[1] 3 5 
haystack[indices] 
[1] 4 4 

両方がベクトルであり、同様に複数のベクターを使用するように拡張することができた場合にそれが動作します。

+1

'=='演算子は、私の質問では、針のベクトルでは機能しない非効率な解決策としてすでに言及されていました。 –

+0

「両方がベクトルの場合には動作します」 - 多分、あなたが意味することに応じて...しかし、OPが望んだ意味ではありません。 – Frank

+10

この例ではインデックスの代わりに 'FALSE FALSE TRUE FALSE TRUE'を返します –

関連する問題