2017-03-24 3 views
0

Matrixパッケージを使用しています。私はベクトルをsparseVectorでインデックス化する

values <- runif(3) 

は、今私はindex.map例えば介さvaluesの要素を抽出したい(通常のベクトル)をルックアップするためにスパーセベクター

index.map <- sparseVector(x=1:3, i=c(10, 33, 50), length=50) 

といくつかの値を持っています

values[index.map[33]] # should return values[2] 

RはsparseVectorによって数値valuesをサブセットする方法を知らないので、私はエラーおそらく

Error in values[index.map[33]] : invalid subscript type 'S4'

を取得します。 私が検索を行うために整数にindex.mapを強制することができます

values[as(index.map[33], 'integer')] == values[2] # TRUE 

が、これは、このような簡単な操作のためにかなり冗長である、と私は強制私はindex.mapを使用するたびに行うようになってきました - 私はしませんよこれがいかに効率的であるか確かめてください

このインデックス作成を行う別の方法はありますか?またはこれは唯一のオプションですか?


私は多分スパーセベクターにvaluesを変換することはおそらく行列のパッケージは、別のスパーセベクターでスパーセベクターをサブセットする方法を知っているだろうが、それはないとして、役立つかもしれないと思った:

as(values, 'sparseVector')[index.map[33]] 
# Error in as(values, "sparseVector")[index.map[33]] : 
# object of type 'S4' is not subsettable 

更新@x(ありがとう@AleksandrVoitov!)は常に動作していないようです。予想通りas(.., 'integer')index.map[c(10, 10, 33)]の作品を使用しながら、例えば

values[index.map[c(10, 10, 33)]@x] 

は、values[c(1, 2, 1)]いうよりvalues[c(1, 1, 2)]を返しています。おそらく@xは、sparseVectorとやりとりするための「パブリック」な方法ではありませんか?

答えて

1

はとsubseting試してみてください。

values[index.map[33]@x] 

これは素晴らしい、えーえあなた

values[2]=0.608075 
+0

を与えるだろう!ありがとう。何年も前にRを使っていたにもかかわらず、私はまだS4を正しく理解していません... –

+0

本当です。 S4は日常生活では珍しいことです。 –

+0

おっと、ハングアップします。解決策は必ずしも機能しません。 'values [c(1、1、2)] 'ではなく、' values [index.map [c(10、10、33)] @ x] 'は' values [c(1、2、 。 'values [as(index.map [c(10、10、33)]、 'integer')]'は期待どおりに動作します。 '@ x'は公式にサポートされていますか? –

関連する問題