2013-09-24 23 views
5

Tôi có một vector của độ rộng,R chuyển đổi vector của con số để chỉ số bỏ qua

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

Từ vector này, tôi muốn có một vector của hình thức này:

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

Để tạo ra vector như vậy tôi đã làm như sau cho vòng lặp trong 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 
} 

Logic như sau, mỗi phần tử trong ws chỉ định sự tôn trọng số lượng các phần tử trong chỉ mục. Ví dụ, nếu ws là 1, số phần tử tương ứng trong các chỉ mục là 1, nhưng nếu ws là> 1, chúng ta hãy nói 3, số phần tử tương ứng trong chỉ mục là 3 và các phần tử bị bỏ qua 1-by-1, tương ứng với 3,5,7.

Tuy nhiên, tôi muốn tránh các vòng vì chúng có xu hướng rất chậm trong R. Bạn có bất cứ đề xuất nào về cách đạt được kết quả như vậy chỉ với các hoạt động vectơ không? hoặc một số giải pháp crantastic hơn?

Cảm ơn!

Trả lời

5

Dưới đây là một vectorized một lót dành cho bạn:

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 

Bạn có thể nhặt nó ngoài mảnh bằng mảnh, làm việc kể từ trong ra ngoài, để xem cách nó hoạt động.

+0

đây là siêu cranstastic! :-) cám ơn. – Dnaiel

Các vấn đề liên quan