You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于值范围的行重复过滤:求dplyr与data.table解决方案

数据过滤解决方案

数据构造

首先生成测试数据:

date <- Sys.Date() + sort(sample(1:26, 26))

values <- c(sample(400:415, 10, replace = TRUE), 
            420, 421, 422, 420, 419, 421, 
            sample(430:435, 10, replace = TRUE))

df <- data.frame(date, values)

需求说明

当date按升序排列时,筛选出values处于**420±2(即418~422)**范围内,且该范围内连续行数量至少5次的数据,最终保留中间的6个目标行,移除前后sample()生成的无关数据。


dplyr 解决方案

library(dplyr)

result_dplyr <- df %>%
  arrange(date) %>%  # 按日期升序排列
  mutate(in_range = between(values, 418, 422)) %>%  # 标记是否在目标区间内
  group_by(rle_id = with(rle(in_range), rep(seq_along(lengths), lengths))) %>%  # 按连续状态分组
  filter(in_range, n() >= 5) %>%  # 筛选符合条件的组
  ungroup() %>%
  select(-in_range, -rle_id)  # 移除辅助列

步骤说明

  1. 按date对数据升序排序;
  2. 标记每行values是否落在418~422区间;
  3. 用rle()识别连续的同状态行,生成分组ID;
  4. 筛选处于目标范围且组内行数≥5的分组;
  5. 移除辅助列得到最终结果。

data.table 解决方案

library(data.table)

setDT(df)

result_dt <- df[order(date)][, 
  in_range := between(values, 418, 422)][, 
  rle_id := rleid(in_range)][, 
  .SD[in_range & .N >= 5], by = rle_id][, 
  .(date, values)]

步骤说明

  1. 将data.frame转换为data.table并按date升序排序;
  2. 标记每行是否在目标区间内;
  3. 用rleid()生成连续同状态的分组ID;
  4. 按分组筛选,保留符合条件的子数据集;
  5. 仅保留date和values列得到最终结果。

内容的提问来源于stack exchange,提问作者clc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:45:26