2013-09-24 3 views
5

у меня есть вектор ширины,R преобразовать вектор чисел в пропуске индексов

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

Из этого вектора я хотел бы иметь еще один вектор этой формы:

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

Для того, чтобы создать такой вектор я сделал следующее цикл в 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 
} 

логика следующим образом, каждый элемент WS определяет respectiv e количество элементов в индексе. Например, если ws равно 1, соответствующее число элементов в индексах равно 1, но если ws равно> 1, скажем 3, то соответствующее число элементов в индексе равно 3, а элементы пропускаются 1 на 1, что соответствует 3,5,7.

Однако, я бы хотел избежать циклов, поскольку они имеют тенденцию быть очень медленными в R. Есть ли у вас какие-либо предложения о том, как добиться таких результатов только с помощью векторных операций? или еще более crantastic решение?

Спасибо!

ответ

5

Вот Векторизованный один вкладыш для вас:

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 

Вы можете забрать его отдельно по частям, работая изнутри, чтобы увидеть, как это работает.

+0

это супер красностатический! :-) спасибо. – Dnaiel

Смежные вопросы