2012-05-08 19 views
2

Rでは、冗長名前付きベクトルを持つ場合、選択演算子で名前付きベクトルのすべての要素を取り出すことができないのはなぜですか?Rで冗長名前付きベクトルの索引付け

v <- c(1,2,3,4,5) 
names(v) <- c("a","b","c","c","a") 
v["c"] ## Returns only 3, not c(3,4) 

Rはベクトル名が一意であるとみなし、選択演算子の引数と名前が一致するベクトルの最初の要素のみを取得するように見えます。

これは何らかの最適化ですか?同じ名前の属性を持つベクトル内の複数の要素を選択できたら、それは有益ではないでしょうか? インデックス演算子を使用するときに返される要素の数がインデックスベクトルの要素の数と同じであることを保証することは重要ですか?

+0

なぜユニークでない名前のリストを使用したいのですか? –

+1

直接関係はありませんが、[make.names](http://stat.ethz.ch/R-manual/R-devel/library/base/html/make.names.html)関数については、多くの場合便利ですあまりにも多くのユーザーの干渉なしで冗長な名前を削除すること。 – Chase

+0

私の意図は、ベクトルをルックアップとして使用して、たとえば遺伝情報IDをentrezdatabaseIDs。この場合、名前(v)のいくつかのgeneymbolIDは、vの同じentrezdatabaseIDにマップすることができ、名前(v)に冗長性を与えます。 – Tony

答えて

2

あなたは何をしようとしているのかの名前を使用したくないです。それぞれの商品に一意の名前をつけるのではなく、カテゴリ変数を作成しています。これは重要な意味の違いです。

v <- c(1,2,3,4,5) 
cat_v <- c("a","b","c","c","a") 
v[cat_v == 'c'] ## Returns c(3,4) 
+0

よろしくお願いいたします。私は、Rの意図は、少なくとも、[ – Tony

2

これは教育的な推測です。確認または不承認です。 (下記の確認)

投稿者?"[": "文字ベクトルはオブジェクトの名前と一致します"。

> match("c",names(v)) 
[1] 3 

あなたは使用してこの問題を回避できます。

> v[names(v)%in%"c"] 
c c 
3 4 

EDIT[プリミティブ関数であり、それは実際にmatchを使用しないように。ソースコードは答えを保持していますが、まだ見つかりませんでした。

EDIT2:

ソースコードから回答:C関数do_subsetを呼び出し[ R関数、ソースファイル./src/main/subset.cに見出すことができます。あなたが指定した例では、C関数stringSubscriptが最終的に呼び出され、これは、一致するものが見つかるまで、サブセット(この場合はv)であるベクトルの各名前を反復処理します。その時点で、反復は停止され、対応する索引および名前が戻されます。

したがって、v["a"]を使用してサブセットすると、最初に一致する名前に対応するベクトルの値のみが返されます。したがって、一意の名前を使用するには、他の回答とコメントの示唆に従うことをお勧めします。

+0

OKです。答えてくれてありがとう! – Tony

関連する問題