R中布尔向量之间的顺序索引

时间:2017-09-28 19:46:29

标签: r seq

标题说明了。

我的载体

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 个答案:

答案 0 :(得分: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()对我们施加压力。

答案 1 :(得分: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

答案 2 :(得分:2)

您还可以使用inverse.seqle中的cgwtools

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

答案 3 :(得分: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

答案 4 :(得分: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