2017-09-28 9 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

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()私たちのための強制です。

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

または類似@ d.bの答えに:

2

またinverse.seqlecgwtoolsから使用することができます

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を使用することによって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

関連する問題