Finding local maxima and minima

前端 未结 14 1656
说谎
说谎 2020-11-22 07:24

I\'m looking for a computationally efficient way to find local maxima/minima for a large list of numbers in R. Hopefully without for loops...

For exampl

14条回答
  •  终归单人心
    2020-11-22 08:20

    Here's the solution for minima:

    @Ben's solution

    x <- c(1,2,3,2,1,2,1)
    which(diff(sign(diff(x)))==+2)+1 # 5
    

    Please regard the cases at Tommy's post!

    @Tommy's solution:

    localMinima <- function(x) {
      # Use -Inf instead if x is numeric (non-integer)
      y <- diff(c(.Machine$integer.max, x)) > 0L
      rle(y)$lengths
      y <- cumsum(rle(y)$lengths)
      y <- y[seq.int(1L, length(y), 2L)]
      if (x[[1]] == x[[2]]) {
        y <- y[-1]
      }
      y
    }
    
    x <- c(1,2,9,9,2,1,1,5,5,1)
    localMinima(x) # 1, 7, 10
    x <- c(2,2,9,9,2,1,1,5,5,1)
    localMinima(x) # 7, 10
    x <- c(3,2,9,9,2,1,1,5,5,1)
    localMinima(x) # 2, 7, 10
    

    Please regard: Neither localMaxima nor localMinima can handle duplicated maxima/minima at start!

提交回复
热议问题