【问题标题】:Sequentially index between a boolean vector in R [duplicate]R中的布尔向量之间的顺序索引[重复]
【发布时间】: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 

【问题讨论】:

    标签: r seq


    【解决方案1】:
    #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 !!
    • 每个人都给出了很好的答案,我很感激,并将一一复述,但这个最容易理解。
    【解决方案2】:

    您可以将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() 为我们强制执行。

    【讨论】:

      【解决方案3】:

      我们可以使用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】:

        通过使用基础 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 是的,这是很好的建议,谢谢! :)
        【解决方案5】:

        你也可以从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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-08-09
          • 2018-06-21
          • 1970-01-01
          • 1970-01-01
          • 2014-11-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多