R语言如何筛选3天内数值从0变为-5的数据框子集?
R数据框3天间隔条件筛选实现
核心需求
筛选数据框中3天及以内数值从0变化到-5的所有关联记录,排除间隔超过3天的序列段。
完整实现代码
library(lubridate) library(dplyr) # 加载测试数据 data <- data.frame(date = c("2020-06-08", "2020-06-09", "2020-06-10", "2020-06-11", "2020-06-12", "2021-06-13", "2021-06-14", "2021-06-15", "2021-06-16", "2021-06-17", "2021-06-18", "2021-06-19", "2021-06-20"), value = c(2,0,-7,1,0,-1,-2,-3,-4,0,-6,-5,10)) data$date <- as.Date(data$date) # 第一步:提取两类关键节点的日期 zero_dates <- data$date[data$value == 0] neg5_dates <- data$date[data$value == -5] # 第二步:筛选符合时间间隔要求的有效区间 valid_ranges <- expand.grid(start = zero_dates, end = neg5_dates) %>% mutate(day_gap = as.numeric(difftime(end, start, units = "days"))) %>% filter(day_gap >= 0, day_gap <= 3) # 0在-5之前,间隔不超过3天 # 第三步:提取所有落在有效区间内的记录 result <- data %>% rowwise() %>% filter(any(date >= valid_ranges$start & date <= valid_ranges$end)) %>% ungroup()
逻辑说明
- 不需要在
filter里写复杂的滚动判断,先把所有符合时间要求的0值到-5值的时间区间找出来,再匹配对应行即可 - 逻辑可灵活调整:如果要改间隔天数、改起止判断值,直接修改对应参数就行
- 运行后得到的结果会自动保留从0到-5之间的所有中间记录,自动剔除间隔超3天的无效序列(比如示例中0之后连续走了7天才到-5的那段会被排除)
内容的提问来源于stack exchange,提问作者Karmic Dreamwork
相关产品推荐
相关产品推荐

