2017-03-24 2 views
0

Ich verwende das Matrix Paket von R. Ich habe einen sparsevectorIndex ein Vektor von einem SparseVector

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

und einige Werte zu sehen (einen gewöhnlichen Vektor)

values <- runif(3) 

Nun wünsche ich Elemente von values durch index.map gehen zu extrahieren z.B.

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

Ich erhalte den Fehler

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

vermutlich, weil R nicht weiß, wie die numerische values durch eine sparseVector der Teilmenge. Ich kann index.map auf eine ganze Zahl zwingen die Lookup zu tun:

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

aber das ist ziemlich ausführliche für eine solche einfache Bedienung, und ich habe den Zwang zu tun, jedes Mal wenn ich index.map verwenden - ich bin nicht sicher, wie effizient das ist.

Gibt es eine andere Möglichkeit, diese Indizierung durchzuführen? oder ist das die einzige option?


Ich dachte, vielleicht values zu einem sparsevector Umwandlung könnte helfen, wie vielleicht das Matrix-Paket würde wissen, wie eine sparsevector von einem anderen sparsevector der Teilmenge, aber es funktioniert nicht:

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

Update@x (danke @AleksandrVoitov!) Scheint nicht die ganze Zeit zu arbeiten. Zum Beispiel

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

kehrt values[c(1, 2, 1)] statt values[c(1, 1, 2)], während as(.., 'integer') auf index.map[c(10, 10, 33)] Arbeiten mit wie erwartet. Vielleicht ist @x nicht eine "öffentliche" Möglichkeit, mit einem SparseVector zu interagieren?

Antwort

1

Try subseting mit:

values[index.map[33]@x] 

Dies würde Sie

geben
values[2]=0.608075 
+0

Ahhhh, ausgezeichnet! Vielen Dank. Obwohl ich R schon seit vielen Jahren benutze, verstehe ich S4 immer noch nicht richtig ... –

+0

Wahr. Der S4 ist im täglichen Leben etwas ungewöhnlich. –

+0

Hoppla, halt mal. Lösung funktioniert nicht immer. 'values ​​[index.map [c (10, 10, 33)] @ x]' gibt 'Werte [c (1, 2, 1)]' zurück anstatt 'Werte [c (1, 1, 2)]' ' . 'Werte [as (index.map [c (10, 10, 33)], 'Ganzzahl')]' funktioniert wie erwartet. Wird "@ x" offiziell unterstützt? –

Verwandte Themen