Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从向量中提取连续序列_R_Sequence - Fatal编程技术网

R 从向量中提取连续序列

R 从向量中提取连续序列,r,sequence,R,Sequence,我有一个叫做v的向量,有正负值,还有零。问题是,如何(在列表中)提取所有连续的正数序列,即由零分隔的正数序列 以下是第五部分: v <- c(-75.09619, -38.31229, 0, 57.17792, 65.55923, 108.52735, 104.29929, 32.47125,0, 0, 0, 0, -26.65008, -49.48638, -79.60670,-90.55343, -34.60761, 0, 21.48842, 38.83820

我有一个叫做v的向量,有正负值,还有零。问题是,如何(在列表中)提取所有连续的正数序列,即由零分隔的正数序列

以下是第五部分:

v <- c(-75.09619, -38.31229,   0,  57.17792,  65.55923, 108.52735, 104.29929,  32.47125,0,   0,   0,   0, -26.65008, -49.48638, -79.60670,-90.55343, -34.60761,   0, 21.48842, 38.83820, 42.28727, 0)
有什么想法吗?

你可以试试:

indices <- which(v[v>=0]==0)
x <- Map(function(x,y) setdiff(v[v>=0][(y+1):(x-1)],0),
         indices[2:length(indices)],
         indices[1:(length(indices)-1)])
x[vapply(x,length,1L)>0]
#[[1]]
#[1]  57.17792  65.55923 108.52735 104.29929  32.47125
#[[2]]
#[1] 21.48842 38.83820 42.28727
索引=0]==0)
x=0][(y+1):(x-1)],0),
指数[2:长度(指数)],
指数[1:(长度(指数)-1)])
x[vapply(x,长度,1L)>0]
#[[1]]
#[1]  57.17792  65.55923 108.52735 104.29929  32.47125
#[[2]]
#[1] 21.48842 38.83820 42.28727
我所做的:

  • 从由
    v的>=0值构成的向量中取出0位置
  • 使用
    Map
    函数,可以提取两个零之间的向量部分
  • 最后一行的目的是从结果中去除没有值的序列(例如,如果原始向量中有两个或多个零的序列)
    • 这里有一个选项:

      ll <- split(v,cumsum(v==0))                      ## split data by 0 jump
      ll <- lapply(ll,function(x){                     ## for each group 
        x <- x[x!=0]                                   ## remove null values   
        if(all(x>0) && length(x)>0)x else NA      ## check if all values are postifs
      })
      ll[!is.na(ll)]
      
      # $`1`
      # [1]  57.17792  65.55923 108.52735 104.29929  32.47125
      # 
      # $`6`
      # [1] 21.48842 38.83820 42.28727
      
      ll 0)x else NA_real},
      总和(v==0)[!is.na(V1)]
      #康姆森V1
      # 1:      1  57.17792
      # 2:      1  65.55923
      # 3:      1 108.52735
      # 4:      1 104.29929
      # 5:      1  32.47125
      # 6:      6  21.48842
      # 7:      6  38.83820
      # 8:      6  42.28727
      
      这里有一个使用
      拆分的简短示例:

      split(v[v>0],cumsum(v==0)[v>0])
      #$`1`
      #[1]  57.17792  65.55923 108.52735 104.29929  32.47125
      #
      #$`6`
      #[1] 21.48842 38.83820 42.28727
      
      这基本上只是将
      v
      细分为正数,然后使用
      cumsum(v==0)
      计数器(它将在一组正值内保持稳定,并在紧接着的
      0
      中增加)来拆分该组。瞧


      再次尝试使用
      rle

      r <- rle(v>0)
      start <- cumsum(r$lengths)[r$values] - r$lengths[r$values] + 1
      end <- start + r$lengths[r$values] - 1
      Map(function(start,end) v[start:end],start,end)
      
      #[[1]]
      #[1]  57.17792  65.55923 108.52735 104.29929  32.47125
      #
      #[[2]]
      #[1] 21.48842 38.83820 42.28727
      
      r0)
      开始我会投一个进去

      v <- c(-75.09619, -38.31229,   0,  57.17792,  65.55923, 108.52735, 104.29929,  32.47125,0,   0,   0,   0, -26.65008, -49.48638, -79.60670,-90.55343, -34.60761,   0,21.48842, 38.83820, 42.28727, 0)
      
      
      r <- rle(v > 0)
      r <- r$lengths[r$values]
      
      (pos <- v[v > 0])
      # [1]  57.17792  65.55923 108.52735 104.29929  32.47125  21.48842  38.83820  42.28727
      
      
      
      lapply(r, function(x) {
        out <- pos[1:x]
        pos <<- pos[-(1:x)]
        out
      })
      
      # [[1]]
      # [1]  57.17792  65.55923 108.52735 104.29929  32.47125
      # 
      # [[2]]
      # [1] 21.48842 38.83820 42.28727
      

      v是的,如果没有列表要求,这可能是微不足道的。对于列表要求,您可能最终会使用
      rle
      和某种循环。这只是为了说明所需的输出(向量列表),您不应该让其他人做您的作业。
      Map
      is
      mapply
      With
      SIMPLIFY=FALSE
      -可能会在这里为您节省几个字符。哦,很好,一种
      rle
      解决方案。现在我可以轻松休息了。现在我们需要一个带有粘贴、gregexpr、regmatches;-)这个
      拆分(v[v>0]、累计值(v==0)[v>0])
      符合我的要求。非常感谢。
      r <- rle(v>0)
      start <- cumsum(r$lengths)[r$values] - r$lengths[r$values] + 1
      end <- start + r$lengths[r$values] - 1
      Map(function(start,end) v[start:end],start,end)
      
      #[[1]]
      #[1]  57.17792  65.55923 108.52735 104.29929  32.47125
      #
      #[[2]]
      #[1] 21.48842 38.83820 42.28727
      
      v <- c(-75.09619, -38.31229,   0,  57.17792,  65.55923, 108.52735, 104.29929,  32.47125,0,   0,   0,   0, -26.65008, -49.48638, -79.60670,-90.55343, -34.60761,   0,21.48842, 38.83820, 42.28727, 0)
      
      
      r <- rle(v > 0)
      r <- r$lengths[r$values]
      
      (pos <- v[v > 0])
      # [1]  57.17792  65.55923 108.52735 104.29929  32.47125  21.48842  38.83820  42.28727
      
      
      
      lapply(r, function(x) {
        out <- pos[1:x]
        pos <<- pos[-(1:x)]
        out
      })
      
      # [[1]]
      # [1]  57.17792  65.55923 108.52735 104.29929  32.47125
      # 
      # [[2]]
      # [1] 21.48842 38.83820 42.28727