我使用下面的代码列出峰值和谷值。
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)。我需要连续的山峰和山谷。
寻找答案。先感谢您。
答案 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)
或者您是否想要自己平滑数据? (你的数据系列很短。)你需要一个方程式来拟合吗?花很多时间在这上面很容易。
我不完全理解这个“峰值/谷值”的东西。无论如何,请查看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)
}