2013-09-24 34 views
5

ich einen Vektor von Breiten haben,R konvertieren Vektor von Zahlen Überspringen Indizes

ws = c(1,1,2,1,3,1) 

Von diesem Vektor würde Ich mag einen anderen Vektor dieser Form haben:

indexes = c(1,2,3,5,6,7,9,11,12) 

Um zu erstellen solcher Vektor habe ich die folgenden für die Schleife in R:

ws = c(1,1,2,1,3,1) 
indexes = rep(0, sum(ws)) 
counter = 1 
counter2 = 1 
last = 0 
for(i in 1:length(ws)) 
{ 
    if (ws[i] == 1) 
    { 
    indexes[counter] = counter2 
    counter = counter + 1 
    } else { 
    for(j in 1:ws[i]) 
    { 
     indexes[counter] = counter2 
     counter = counter + 1 
     counter2 = counter2+2 
    } 
    counter2 = counter2 - 2 
    } 
    counter2 = counter2+1 
} 

die Logik ist wie folgt, legt jedes Element in ws die JEWEILIGEN e Anzahl der Elemente im Index. Zum Beispiel, wenn ws 1 ist, ist die entsprechende Anzahl von Elementen in Indizes 1, aber wenn ws> 1 ist, sagen wir 3, ist die entsprechende Anzahl von Elementen im Index 3 und die Elemente werden 1-mal-1 übersprungen. entsprechend 3,5,7.

Allerdings möchte ich for-Schleifen vermeiden, da sie in R sehr langsam sind. Haben Sie Vorschläge, wie Sie solche Ergebnisse nur mit Vektoroperationen erzielen können? oder eine etwas kretsastische Lösung?

Danke!

Antwort

5

Hier ist ein vektorisiert Einzeiler für Sie:

ws <- c(1,1,2,1,3,1) 

cumsum((unlist(sapply(ws, seq_len)) > 1) + 1) 
# [1] 1 2 3 5 6 7 9 11 12 

Sie können es Stück für Stück auseinander nehmen, von innen ausarbeitet, um zu sehen, wie es funktioniert.

+0

das ist super cantastic! :-) Danke. – Dnaiel

Verwandte Themen