です。タイトルはそれを示しています。連続したブール値ベクトルのインデックスはR
私のベクトル
TF <- c(F,T,T,T,F,F,T,T,F,T,F,T,T,T,T,T,T,T,F)
あなたはsequence()
とともにrle()
を使用することができ、私の所望の出力
[1] 0 1 2 3 0 0 1 2 0 1 0 1 2 3 4 5 6 7 0
です。タイトルはそれを示しています。連続したブール値ベクトルのインデックスはR
私のベクトル
TF <- c(F,T,T,T,F,F,T,T,F,T,F,T,T,T,T,T,T,T,F)
あなたはsequence()
とともにrle()
を使用することができ、私の所望の出力
[1] 0 1 2 3 0 0 1 2 0 1 0 1 2 3 4 5 6 7 0
#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
。
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の答えに:
またinverse.seqle
cgwtools
から使用することができます
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
は、我々が使用できる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
ベース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
'TF == FALSE'はもっと単純に'!TF'です。また、 'cumsum(!TF)'を最初に割り当てるのは、二度計算する必要がないので、より効率的です。 –
@RichScrivenええ、それは素晴らしい提案です、ありがとうございます! :) – Wen
'シーケンス(長さ)* TF'! –
誰もがすばらしい答えをくれて、私は感謝していきます。 –