Finding local maxima and minima

前端 未结 14 1674
说谎
说谎 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:03

    There are some good solutions provided, but it depends on what you need.

    Just diff(tt) returns the differences.

    You want to detect when you go from increasing values to decreasing values. One way to do this is provided by @Ben:

     diff(sign(diff(tt)))==-2
    

    The problem here is that this will only detect changes that go immediately from strictly increasing to strictly decreasing.

    A slight change will allow for repeated values at the peak (returning TRUE for last occurence of the peak value):

     diff(diff(x)>=0)<0
    

    Then, you simply need to properly pad the front and back if you want to detect maxima at the beginning or end of

    Here's everything wrapped in a function (including finding of valleys):

     which.peaks <- function(x,partial=TRUE,decreasing=FALSE){
         if (decreasing){
             if (partial){
                 which(diff(c(FALSE,diff(x)>0,TRUE))>0)
             }else {
                 which(diff(diff(x)>0)>0)+1
             }
         }else {
             if (partial){
                 which(diff(c(TRUE,diff(x)>=0,FALSE))<0)
             }else {
                 which(diff(diff(x)>=0)<0)+1
             }
         }
     }
    

提交回复
热议问题