【发布时间】:2020-07-11 05:21:43
【问题描述】:
R中是否有一个函数可以将向量作为输入并输出具有局部最小值和最大值的向量,以及它们在原始向量中出现的位置?
【问题讨论】:
-
你能展示一个小例子和预期的输出吗
-
如果你只是想看看最初的区别,比如
min_max = which(diff(sign(diff(x))) != 0) + 1。
R中是否有一个函数可以将向量作为输入并输出具有局部最小值和最大值的向量,以及它们在原始向量中出现的位置?
【问题讨论】:
min_max = which(diff(sign(diff(x))) != 0) + 1。
让v 是一个普通向量,并将峰定义为严格大于任一侧的元素的元素,对于谷也类似。
1) rollapply 然后下面给出两个逻辑向量,每个逻辑向量的长度都与v相同。一个用TRUE和FALSE表示波峰的位置,另一个用相同的方式表示波谷。 which(peaks) 和 which(troughs) 可用于获取索引号(如果首选该表示形式)。
library(zoo)
peaks <- rollapply(v, 3, function(x) x[2] > max(x[-2]), fill = FALSE)
troughs <- rollapply(v, 3, function(x) x[2] < min(x[-2]), fill = FALSE)
我们可以像这样组合它们,其中每个输出分量如果是峰值则为 1,如果是谷则为 -1,否则为 0。
extreme <- function(x) (x[2] > max(x[-2])) - (x[2] < min(x[-2]))
rollapply(v, 3, extreme, fill = FALSE)
2) Base R Base R 方法是:
prev <- c(NA, v[-length(v)])
post <- c(v[-1], NA)
(v > pmax(prev, post)) - (v < pmin(prev, post))
【讨论】: