Нахождение локальных максимумов и минимумов - PullRequest
59 голосов
/ 27 июля 2011

Я ищу вычислительно эффективный способ найти локальные максимумы / минимумы для большого списка чисел в R. Надеюсь, без for петли ...

Например, если у меня есть файл данных типа 1 2 3 2 1 1 2 1, я хочу, чтобы функция возвращала 3 и 7, которые являются позициями локальных максимумов.

Ответы [ 12 ]

0 голосов
/ 14 апреля 2018

В пакете pracma используйте

tt <- c(1,2,3,2,1, 1, 2, 1)
tt_peaks <- findpeaks(tt, zero = "0", peakpat = NULL,
       minpeakheight = -Inf, minpeakdistance = 1, threshold = 0, npeaks = 0, sortstr = FALSE)

  [,1] [,2] [,3] [,4]
  [1,]  3    3    1    5
  [2,]  2    7    6    8

Возвращает матрицу с 4 столбцами. Первый столбец показывает абсолютные значения локальных пиков. 2-й столбец - индексы 3-й и 4-й столбцы - это начало и конец пиков (с потенциальным перекрытием).

Подробнее см. https://www.rdocumentation.org/packages/pracma/versions/1.9.9/topics/findpeaks.

Одно предупреждение: я использовал его в серии нецелых чисел, и пик был на один индекс слишком поздно (для всех пиков), и я не знаю почему. Поэтому мне пришлось вручную удалить «1» из моего вектора индекса (ничего страшного).

0 голосов
/ 14 октября 2013

Я опубликовал это в другом месте, но я думаю, что это интересный способ сделать это. Я не уверен, какова его вычислительная эффективность, но это очень лаконичный способ решения проблемы.

vals=rbinom(1000,20,0.5)

text=paste0(substr(format(diff(vals),scientific=TRUE),1,1),collapse="")

sort(na.omit(c(gregexpr('[ ]-',text)[[1]]+1,ifelse(grepl('^-',text),1,NA),
 ifelse(grepl('[^-]$',text),length(vals),NA))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...