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

R中布尔向量之间的顺序索引,r,seq,R,Seq,标题说明了这一点 我的向量 TF <- c(F,T,T,T,F,F,T,T,F,T,F,T,T,T,T,T,T,T,F) 您可以将rle与序列一起使用 替换为我们执行强制。您也可以使用cgwtools中的inverse.sekle: #with(rle(TF), sequence(lengths) * rep(values, lengths)) with(rle(TF), sequence(lengths) * TF) #Like Rich suggested in comments #

标题说明了这一点

我的向量

TF <- c(F,T,T,T,F,F,T,T,F,T,F,T,T,T,T,T,T,T,F)
您可以将rle与序列一起使用

替换为我们执行强制。

您也可以使用cgwtools中的inverse.sekle:

#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
或类似于@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
我们可以使用rleid

使用base 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

SequenceLength*TF!!每个人都给出了很好的答案,我对此表示感谢,并将逐一进行讨论,但这个答案最容易理解。TF==FALSE更简单!TF。还有,分配cumsum!TF first会更有效,因为您不需要计算两次。@RichScriven是的,这是一个很好的建议,谢谢!!:
library(cgwtools)
SEQ = inverse.seqle(rle(TF)) 
SEQ[!TF] = 0
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
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
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