如何在R中基于阈值与时间间隔过滤时间序列数据
R时间序列按阈值筛选日期解决方案
可以用dplyr结合lubridate包实现需求,步骤如下:
- 标记符合阈值的记录,划分连续符合条件的区间,提取第一个连续区间的最后日期;
- 筛选与第一个日期间隔至少两年的、符合阈值的记录,取对应日期。
完整代码
library(dplyr) library(lubridate) dat <- data.frame(time = as.Date(c("2001-12-31","2002-12-31","2003-12-31","2004-12-31", "2005-12-31","2006-12-31","2007-12-31","2008-12-31")), value = c(-52.1,-52.44,23.5,-64.2,10.7,-15.4,-52.4,231.7)) # 提取首次连续符合阈值区间的最后日期 first_interval_last <- dat %>% mutate(meet_threshold = value <= -50, # 生成连续符合条件的分组ID group_id = cumsum(c(TRUE, diff(meet_threshold) != 0))) %>% filter(meet_threshold) %>% group_by(group_id) %>% slice_tail(n = 1) %>% ungroup() %>% slice_head(n = 1) %>% pull(time) # 筛选间隔至少两年的符合阈值日期 second_date <- dat %>% filter(value <= -50, time >= first_interval_last + years(2)) %>% slice_head(n = 1) %>% pull(time) # 合并结果 result <- c(first_interval_last, second_date) print(result)
输出结果
[1] "2002-12-31" "2007-12-31"
代码说明
meet_threshold列标记符合value ≤ -50的行;group_id通过cumsum和diff划分连续符合条件的区间;slice_tail提取每个连续区间的最后日期,slice_head锁定第一个区间的结果;- 第二步用
time >= first_interval_last + years(2)确保间隔要求,再取首个符合条件的日期。
内容的提问来源于stack exchange,提问作者Only
相关产品推荐
相关产品推荐

