【问题标题】:Is there a way to extract continuous feature in an 2D array有没有办法在二维数组中提取连续特征
【发布时间】:2010-03-18 13:56:26
【问题描述】:

假设我有一个数字数组

a

如果有办法告诉 R 只输出从“a”开始的连续序列的范围 例如,“a”中的连续序列如下

1,3 6,10 20

非常感谢! 德里克

【问题讨论】:

    标签: r arrays sequence continue


    【解决方案1】:

    我认为没有直接的方法,但您可以创建两个逻辑向量来告诉您下一个/上一个元素是否是 1 最大/最小。例如:

    data.frame(
      a,
      is_first = c(TRUE,diff(a)!=1),
      is_last = c(diff(a)!=1,TRUE)
    )
    # Gives you:
       a is_first is_last
    1  1     TRUE   FALSE
    2  2    FALSE   FALSE
    3  3    FALSE    TRUE
    4  6     TRUE   FALSE
    5  7    FALSE   FALSE
    6  8    FALSE   FALSE
    7  9    FALSE   FALSE
    8 10    FALSE    TRUE
    9 20     TRUE    TRUE
    

    所以范围是:

    cbind(a[c(TRUE,diff(a)!=1)], a[c(diff(a)!=1,TRUE)])
    [1,]    1    3
    [2,]    6   10
    [3,]   20   20
    

    【讨论】:

      【解决方案2】:

      我这样做了(我承认不是那么优雅)以防您想要列表中每个序列的所有数字

      a <- c(1,2,3,6,7,8,9,10,20)
      
      z <- c(1,which(c(1,diff(a))!=1))
      
      g <- lapply(seq(1:length(z)),function(i) {
      if (i < length(z)) a[z[i] : (z[i+1] - 1)] 
      else a[z[i] : length(a)] 
      })
      
      
      [[1]]
      [1] 1 2 3
      
      [[2]]
      [1]  6  7  8  9 10
      
      [[3]]
      [1] 20
      

      然后你可以得到一个像这样的二维数组

      sapply(g,function(x) c(x[1],x[length(x)]))
      
           [,1] [,2] [,3]
      [1,]    1    6   20
      [2,]    3   10   20
      

      【讨论】:

        【解决方案3】:
        > a <- c(1,2,3,6,7,8,9,10,20)
        > N<-length(a)
        > k<-2:(N-1)
        > z<-(a[k-1]+1)!=a[k] | (a[k+1]-1)!=a[k]
        > c(a[1],a[k][z],a[N])
        [1]  1  3  6 10 20
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-13
          • 1970-01-01
          • 2017-03-10
          • 2021-07-04
          • 1970-01-01
          • 2021-03-30
          相关资源
          最近更新 更多