2017-09-28 34 views

回答

6
#with(rle(TF), sequence(lengths) * rep(values, lengths)) 
with(rle(TF), sequence(lengths) * TF) #Like Rich suggested in comments 
# [1] 0 1 2 3 0 0 1 2 0 1 0 1 2 3 4 5 6 7 0 
+3

'序列(長度)* TF'! –

+2

每個人都給出了很好的答案,我很欣賞,並會一一瀏覽,但這是最容易理解的。 –

6

你可以使用rle()sequence()一起。

replace(TF, TF, sequence(with(rle(TF), lengths[values]))) 
# [1] 0 1 2 3 0 0 1 2 0 1 0 1 2 3 4 5 6 7 0 

replace()確實脅迫我們。

2

您還可以使用inverse.seqlecgwtools

library(cgwtools) 
SEQ = inverse.seqle(rle(TF)) 
SEQ[!TF] = 0 

或相似@ d.b的回答是:

inverse.seqle(rle(TF))*TF 

# [1] 0 1 2 3 0 0 1 2 0 1 0 1 2 3 4 5 6 7 0 
2

我們可以使用rleid

library(data.table) 
ave(TF, rleid(TF), FUN = seq_along)*TF 
#[1] 0 1 2 3 0 0 1 2 0 1 0 1 2 3 4 5 6 7 0 
2

通過使用鹼基R

ave(cumsum(TF==FALSE), cumsum(TF==FALSE), FUN=seq_along)-1 
[1] 0 1 2 3 0 0 1 2 0 1 0 1 2 3 4 5 6 7 0 
+2

'TF == FALSE'更簡單'!TF'。另外,首先分配'cumsum(!TF)'會更有效率,因爲你不需要計算兩次。 –

+0

@RichScriven是的,這是偉大的建議,謝謝! :) – Wen