在向量中找到峰值

时间:2012-10-17 23:44:37

标签: r

我试图在矢量中找到“峰值”,即两侧最近的相邻元素不具有相同值的元素具有较低值。

所以,例如在向量中

c(0,1,1,2,3,3,3,2,3,4,5,6,5,7)

在位置5,6,7,12和14处有峰值

Finding local maxima and minima接近,但不太合适。

1 个答案:

答案 0 :(得分:7)

这应该有效。对diff(sign(diff(x)) == -2的调用实际上是通过测试rle选取的每个唯一值的/或附近的负二阶导数来找到峰值。

x <- c(0,1,1,2,3,3,3,2,3,4,5,6,5,7)

r <- rle(x)
which(rep(x = diff(sign(diff(c(-Inf, r$values, -Inf)))) == -2, 
          times = r$lengths))
# [1]  5  6  7 12 14

(我用-Inf s填充了矢量,以便元素1和14都有可能匹配,如果最近的不同值元素具有较低的值。显然可以调整端元素匹配通过将这些中的一个或两个设置为Inf来规则。)