0

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

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)

很快...

在此处输入图像描述 使用输出(列表)绘制的图形。我的问题是如何在此代码中添加阈值?或者我怎样才能删除小的峰和谷(值小于 1)。我需要连续的高峰和低谷。

寻找答案。先感谢您。

4

2 回答 2

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) 

在此处输入图像描述?

还是您更愿意自己平滑数据?(你的数据系列很短。)你需要一个适合的方程吗?很容易花一些时间在上面。

我不完全理解这个“峰/谷”的东西。无论如何,看看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 的阈值。我不确定这是否正确。但是您可以根据需要调整此代码。

于 2017-07-04T15:33:10.533 回答
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)
} 
于 2017-07-10T09:00:56.070 回答