2016-05-12 12 views
2

Auswählen habe ich eine Matrix:R: eine andere Zeile in jeder Spalte effizient

x = rbind(1:5, 6:10) 
x 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 2 3 4 5 
[2,] 6 7 8 9 10 

Ich mag, für jede Spalte eine andere Zeile auszuwählen, basierend auf einem Index. Zum Beispiel könnte ich möchte einen neuen Vektor erhalten, wie

[1] 1 2 8 4 10 

sieht durch Reihen c(1,1,2,1,2) an den entsprechenden Spalten auswählen. Ich kann es also:

diag(x[c(1,1,2,1,2),]) 
[1] 1 2 8 4 10 

aber das ist Speicher ineffizient, weil es diese Matrix zu erstellen:

x[c(1,1,2,1,2),] 
    [,1] [,2] [,3] [,4] [,5] 
[1,] 1 2 3 4 5 
[2,] 1 2 3 4 5 
[3,] 6 7 8 9 10 
[4,] 1 2 3 4 5 
[5,] 6 7 8 9 10 

ein echten Daten-Set und mehr Iterationen Ich bin besorgt über ein schweres Leistungsproblem gegeben. Wie kann ich die gleichen Werte basierend auf meinem Index effizient extrahieren?

Antwort

6

Wir verwenden row/column Indizierung

x[cbind(c(1,1,2,1,2), 1:ncol(x))] 
#[1] 1 2 8 4 10 
+1

interessant. Ich wusste nie, dass es vorher möglich ist. – zyurnaidi

Verwandte Themen