如何在R中查找时间序列的首个极值(峰值/谷值)并提取对应数值
提取ggpmisc stat_peaks/stat_valleys识别到的极值数值的方案
方法1:直接提取ggplot图层计算结果(与可视化标记完全一致)
stat_peaks和stat_valleys在渲染绘图时已经完成了极值计算,直接提取ggplot对象的内置图层数据即可,不需要重新运行算法:
library(ggplot2) library(ggpmisc) library(data.table) library(magrittr) # 示例数据 data <- data.table(x = c(1, 2, 3, 4, 5, 6, 7, 8), y = c(1, -1, 2, 3, 3, 1, 3, 1)) # 将原绘图代码的结果赋值给ggplot对象 p <- data %>% ggplot(aes(x = x, y = y)) + geom_line() + stat_peaks(col = "red", span = NULL, ignore_threshold = 0.01) + stat_valleys(col = "blue", span = NULL, ignore_threshold = 0.01) # 提取峰值数据:geom_line是第1个图层,stat_peaks为第2个图层 peaks_res <- layer_data(p, i = 2) # 提取谷值数据:stat_valleys为第3个图层 valleys_res <- layer_data(p, i = 3)
你需要的极值坐标和数值直接从peaks_res$x、peaks_res$y以及valleys_res$x、valleys_res$y中获取即可,和可视化标记的结果100%匹配。
方法2:适配find_peaks参数实现相同提取逻辑
find_peaks不支持span=NULL参数,而span=NULL对应的逻辑是判断点是否大于/小于所有相邻点,平峰取中间位置,你可以将span设置为大于序列长度的奇数,即可达到完全一致的效果:
# 提取峰值索引 peak_idx <- find_peaks(data$y, span = 7, ignore_threshold = 0.01) # 对应峰值数据 peak_data <- data[peak_idx, ] # 提取谷值索引 valley_idx <- find_valleys(data$y, span = 7, ignore_threshold = 0.01) # 对应谷值数据 valley_data <- data[valley_idx, ]
内容的提问来源于stack exchange,提问作者Bolle
相关产品推荐
相关产品推荐

