3

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 は、ベクトル名が一意であると想定し、名前が選択演算子の引数と一致するベクトルの最初の要素のみを取得するようです。

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

4

2 に答える 2

3

これは経験に基づいた推測であるため、確認または反証は大歓迎です。(下記確認)

From ?"[": 「文字ベクトルはオブジェクトの名前に一致します」。

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

次を使用してこれを回避できます。

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

EDIT :[はプリミティブ関数であるため、実際には使用していませんmatch。ソースコードには答えがありますが、まだ見つけていません。

EDIT2:

ソース コードからの答え: R 関数は、ソース ファイル./src/main/subset.c[にあるC 関数を呼び出します。あなたが示した例では、最終的にC関数が呼び出され、一致するものが見つかるまで、サブセットであるベクトルの各名前(この場合)を繰り返します。その時点で反復が停止し、対応するインデックスと名前が返されます。do_subsetstringSubscriptv

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

于 2012-05-08T13:34:54.267 に答える
2

やろうとしていることに名前を使用したくありません。各項目に一意の名前を付けるのではなく、カテゴリ変数を作成しています。これは重要な意味上の違いです。

v <- c(1,2,3,4,5)
cat_v <- c("a","b","c","c","a")
v[cat_v == 'c'] ## Returns c(3,4)
于 2012-05-08T13:53:26.287 に答える