2013-09-24 12 views
5

ho un vettore di larghezze,R convertire vettore di numeri per indici saltare

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

Da questo vettore Mi piacerebbe avere un altro vettore di questa forma:

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

Al fine di creare tale vettore feci il seguente ciclo for 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 
} 

la logica è come segue, ogni elemento ws specifica l'respectiv numero di elementi nell'indice Ad esempio se ws è 1, il numero rispettivo di elementi negli indici è 1, ma se ws è> 1, diciamo 3, il numero rispettivo di elementi nell'indice è 3 e gli elementi vengono saltati 1 per 1, corrispondente a 3,5,7.

Tuttavia, mi piacerebbe evitare i loop poiché tendono ad essere molto lenti in R. Avete suggerimenti su come ottenere tali risultati solo con operazioni vettoriali? o qualche altra soluzione più croccante?

Grazie!

risposta

5

Ecco un vectorized one-liner per voi:

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 

si può prendere lo distingue pezzo per pezzo, lavorando dall'interno verso l'esterno, per vedere come funziona.

+0

questo è super cranstastico! :-) grazie. – Dnaiel

Problemi correlati