【问题标题】:Get index of vector between 1nd and 2nd appearance of number 1获取数字 1 的第 1 次和第 2 次出现之间的向量索引
【发布时间】:2015-06-06 16:54:41
【问题描述】:

假设我们有一个向量:

v <- c(0,0,0,1,0,0,0,1,1,1,0,0)

预期输出:

v_index <- c(5,6,7)

v 始终以 0 开头和结尾。在两个1s 之间只有一种可能的零簇。

看起来很简单,我无法理解......

【问题讨论】:

    标签: r


    【解决方案1】:
    v <- c(0,0,0,1,0,0,0,1,1,1,0,0)
    v_index<-seq(which(v!=0)[1]+1,which(v!=0)[2]-1,1)
    
    
    > v_index
    [1] 5 6 7
    

    解释:请问哪些索引不等于0:

    which(v!=0)
    

    然后我从该向量中获取第一个和第二个索引并从中创建一个序列。

    【讨论】:

      【解决方案2】:

      我觉得这样就可以了

      which(cumsum(v == 1L) == 1L)[-1L]
      ## [1] 5 6 7
      

      这里的想法是将“one”的所有实例分成组并选择第一个组,同时删除开头出现的“one”(因为您只想要零)。

      【讨论】:

      • 1L 是整数类,1 是数字类。有什么理由使用1L 而不仅仅是1
      • 没有特别的原因。我认为它有点快,我的印象是你在这里处理整数(尽管typeof(v) 返回double)。关于这个hereherehere有一些讨论。在您的情况下,您也可以在没有 L 的情况下生存。
      【解决方案3】:

      这可能是最简单的答案之一。找出哪些项目等于一个,然后使用前两个索引生成一个序列,第一个递增,另一个递减。

      block <- which(v == 1)
      start <- block[1] + 1
      end <- block[2] - 1
      v_index <- start:end
      v_index
      [1] 5 6 7
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-13
        • 1970-01-01
        • 2010-09-16
        • 1970-01-01
        • 2016-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多