【发布时间】:2017-09-28 19:46:29
【问题描述】:
标题已经说明了。
我的矢量
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
【问题讨论】:
标题已经说明了。
我的矢量
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
【问题讨论】:
#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
【讨论】:
sequence(lengths) * TF !!
您可以将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() 为我们强制执行。
【讨论】:
我们可以使用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
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) 会更有效,因为您不需要计算两次。
你也可以从cgwtools使用inverse.seqle:
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
【讨论】: