Последовательный индекс между булевым вектором в R

Название говорит об этом.

мой вектор

TF <- c(F,T,T,T,F,F,T,T,F,T,F,T,T,T,T,T,T,T,F)

мой желаемый результат

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

5 ответов

Решение
#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

Вы могли бы использовать 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() делает принуждение для нас.

Вы также можете использовать inverse.seqle от cgwtools:

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

Или похоже на ответ @db:

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

Используя базу 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

Мы можем использовать 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
Другие вопросы по тегам