標題說明它。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
標題說明它。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
#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
或相似@ 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
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)'會更有效率,因爲你不需要計算兩次。 –
@RichScriven是的,這是偉大的建議,謝謝! :) – Wen
'序列(長度)* TF'! –
每個人都給出了很好的答案,我很欣賞,並會一一瀏覽,但這是最容易理解的。 –