2016-09-15 4 views
0

der folgenden Vektor der Länge Gegeben n=10:eine spezifische Kombination aus allen möglichen Kombinationen in R

# [1] 0 0 0 0 0 1 0 0 1 0 
vec <- c(0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L) 

Angenommen wir den Operator & auf alle möglichen Kombinationen der Vektorelemente anwenden möchten. Das heißt:

res <- combn(n, 2, function(v) vec[v[1]]&vec[v[2]]) 
# total number of possible combinations is n(n-1)/2 = 45 

Wir wissen jedoch, dass das Ergebnis der & Betreiber ist nur wahr, wenn beide Werte 1 sind, und daher können wir es in eine clevere Art und Weise tun. Tatsächlich ist das Ergebnis von combn ein Vektor der Länge 45 mit nur einem Wert von 1 und der Rest sind nur 0.

Nun ist die Frage, wie können wir die Position der einzigen 1 ohne Anwendung der combn selbst extrahieren? Sobald wir es bekommen kann, erzeugen wir das Ergebnis einfach wie folgt:

res <- rep(0, 45) 
res[index] <- 1 

wo index die Position in Frage gestellt ist.

+0

Wie 'n' in der 'combn' Funktion definiert? – Jaap

+1

@Procrastinatus Maximus: 'n = 10' in der ersten Zeile. –

Antwort

0

Wie über diese (unter der Annahme, dass nur zwei Positionen des Vektors sind 1, Rest Nullen sind):

vec <- c(0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L) 

n <- length(vec) 
pos <- which(vec==1) 
index = ifelse(pos[1]==1, 0, sum((n-1):(n-pos[1]+1))) + (pos[2] - pos[1]) 
index 
#[1] 38 

res <- combn(n, 2, function(v) vec[v[1]]&vec[v[2]]) 
which(res==TRUE) 
#[1] 38 
+1

Danke @ Ronak, verpasste eine Zeile –

+0

Danke, aber diese Lösung funktioniert nur für 'vec'. Ist es nicht? – 989

+0

Es sollte für alle Vecs beliebiger Länge funktionieren, die genau 2 Einsen an jeder Position enthalten und nur Nullen übrig lassen. Ich dachte, du wolltest das. –

Verwandte Themen