2016-06-20 7 views
0

Angenommen, ich habe eine Matrix von Werten und einen Vektor, der mir für jede Zeile der Matrix sagt, auf welche (eine!) Spalte ich zugreifen möchte. Wie erhalte ich ohne eine Schleife diese Werte?Subsetting einer Matrix mit einem Vektor von Indizes

Daten:

dta <- structure(c(0.02, 0.01, 0, 0.08, 0.18, 0.01, 0.12, 0, 0.03, 0, 
        0.95, 0.96, 0.94, 0.97, 0.98, 0.95, 0.99, 0.91, 0.96, 0.98, 
        0.98, 0.99, 1, 0.92, 0.82, 0.99, 0.88, 1, 0.97, 1, 
        0.05, 0.04, 0.06, 0.03, 0.02, 0.05, 0.01, 0.09, 0.04, 0.02), 
       .Dim = c(20L, 2L), .Dimnames = list(NULL, c("1", "2"))) 

Vektor von Indizes:

idx <- c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L) 

gewünschte Ausgabe:

0.98 
0.98 
0.99 
0.91 
0.82 
0.99 
0.88 
0.99 
0.96 
0.99 
0.95 
0.96 
0.94 
0.96 
0.97 
0.94 
0.98 
0.91 
0.96 
0.97 

Hintergrund: e1071::cmeans kehrt membership, die Zugehörigkeitswerte aller Punkte zu allen Clustern, und cluster, der wahrscheinlichste Cluster. Ich möchte, dass ein Vektor der Zugehörigkeitswerte der wahrscheinlichsten Cluster transparente Farben für ein Cluster-Diagramm erzeugt.

Antwort

3

Wie wäre es

dta <- structure(c(0.02, 0.01, 0, 0.08, 0.18, 0.01, 0.12, 0, 0.03, 0, 
        0.95, 0.96, 0.94, 0.97, 0.98, 0.95, 0.99, 0.91, 0.96, 0.98, 
        0.98, 0.99, 1, 0.92, 0.82, 0.99, 0.88, 1, 0.97, 1, 
        0.05, 0.04, 0.06, 0.03, 0.02, 0.05, 0.01, 0.09, 0.04, 0.02), 
        .Dim = c(20L, 2L), .Dimnames = list(NULL, c("1", "2"))) 

idx <- c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L) 

dta[cbind(1:nrow(dta), idx)] 

Ich gehe davon aus, dass deutlich length(idx) == nrow(dta). Wenn sie nicht gleich sind, wird R idx so oft stapeln, wie es nötig ist, um die gleiche Anzahl von Elementen wie Zeilen zu haben. Also, wenn Sie das letzte Element idx auslassen erhalten Sie

idx <- c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L) 
dta[cbind(1:nrow(dta), idx)] 

[1] 0.98 0.99 1.00 0.92 0.82 0.99 0.88 1.00 0.97 1.00 0.95 0.96 0.94 0.97 0.98 0.95 0.99 0.91 0.96 0.02 

wo das letzte Element von Spalte zwei gepflückt wird anstelle einer seit R bei idx[1] wieder in Betrieb genommen.

+0

Sie richtig sind, ist der Vektor der gleichen Länge wie die Matrix. – sebastianmm

0

Oder alternativ:

c(dta[which(idx==2),2], dta[which(idx==1),1]) 

# [1] 0.98 0.99 1.00 0.92 0.82 0.99 0.88 1.00 0.97 
# 1.00 0.95 0.96 0.94 0.97 0.98 0.95 0.99 0.91 0.96 0.98 
Verwandte Themen