R峰值和谷值填充阈值

时间:2017-07-04 13:35:25

标签: r minima

我使用下面的代码列出峰值和谷值。

x_last <- as.numeric(series[1])
x <- as.numeric(series[2])
d_last <- (x-x_last)
series[1:2] <- NULL
output <- list()

for (x_next in series){
  if (x_next == x){
    next}
  d_next <- (x_next - x)
  if (d_last * d_next < 0){
    output <- append(output, x)}
  x_last <- x
  x <- x_next
  d_last <- d_next
}

此处输出(列表)包含“连续峰值和谷值”。

Output <- c(41.49916, 37.92029, 39.86477, 39.86432, 39.95672, 39.95465, 39.96144, 39.83994, 40.43357, 40.11285, 40.82250, 39.37034, 58.82975, 42.19894)

等......

enter image description here 使用输出(列表)绘制的图表。我的问题是如何在此代码中添加阈值?或者我如何删除小峰和谷(值小于1)。我需要连续的山峰和山谷。

寻找答案。先感谢您。

2 个答案:

答案 0 :(得分:0)

如果您只想绘制数据:

您可以使用ggplot2绘制此图并添加geom_smooth()图层。它默认为方法“loess”,这对于小型数据集来说是一种“做得对的事”更顺畅。

dat <- data.frame(y=c(41.49916, 37.92029, 39.86477, 39.86432, 39.95672, 39.95465, 39.96144, 39.83994, 40.43357, 40.11285, 40.82250, 39.37034, 58.82975, 42.19894))
dat$x <- 1:length(dat$y)
library(ggplot2)

ggplot(dat, aes(x, y)) +
        geom_line() +
        geom_smooth(method="loess", se=FALSE) 

enter image description here

或者您是否想要自己平滑数据? (你的数据系列很短。)你需要一个方程式来拟合吗?花很多时间在这上面很容易。

我不完全理解这个“峰值/谷值”的东西。无论如何,请查看diff()函数。也许这会有所帮助:

dat <- data.frame(y=c(41.49916, 37.92029, 39.86477, 39.86432, 39.95672, 39.95465, 39.96144, 39.83994, 40.43357, 40.11285, 40.82250, 39.37034, 58.82975, 42.19894))
dat[which(diff(dat$y) < 0.01)+1,"y"] <- NA
dat$y

 [1] 41.50    NA 39.86    NA 39.96    NA    NA    NA 40.43    NA 40.82    NA
[13] 58.83    NA

这里我使用了0.01的阈值。 我不确定这是不对的。但您可以根据需要调整此代码。

答案 1 :(得分:0)

最后我创建了一个函数来移除小周期以保持峰值和谷值。对我而言,这是完美的。

hysteresis <- function(series, min_range){ 
  #hysteresis function will remove cycles within the magnitude of min_range
  #Series: list of values with continuous Peak & valley. 
  series <- unlist(series)
  f <- series[1]
  org <- f
  series <- series[2:length(series)]
  for(i in series){
    val <- abs(i-f)
    if(val > min_range){
      org <- c(org,i)
      f <- i
    }
    #else statement is used to maintain peak and valley
    else{
      org <- org[1:(length(org)-1)]
      f <- org[length(org)]
    }
  }
  return(org)
}