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

如何在R中按时间、位置和个体条件删除冗余数据集行

R语言超大数据集按10分钟窗口去重解决方案

注意:你提供的示例数据集构造代码中,第三个station1缺少引号,需修正为'station1'后再运行后续代码。

原有代码问题定位

  • 排序操作未赋值:data_set_merged %>% arrange(ymd(data_set_merged$date))执行后没有回存到变量,后续计算还是基于乱序数据
  • 时间差计算维度错误:你是先计算全表所有行的时间差再分组,跨个体、跨位置、跨日期的记录也被计算了时间差,不符合业务需求
  • 过滤逻辑错误:时间差小于600秒时会把两条记录都删除,正确逻辑应该是保留分组第一条,仅删除后续和上一条保留记录间隔不足10分钟的行

方案1:固定10分钟窗口去重(适合超大数据集,速度极快)

将时间按每10分钟划分为固定块(如每小时的0-9分、10-19分……),同一个体、同一位置、同一天、同一10分钟块内仅保留第一条记录:

# 加载依赖包
library(dplyr)
library(lubridate)

# 核心处理逻辑
final_df <- stack %>%
  # 生成辅助计算列
  mutate(
    date = as.Date(dt),
    time_block = floor_date(dt, unit = "10 minutes")
  ) %>%
  # 按业务规则分组
  group_by(i, l, date, time_block) %>%
  # 每组仅保留第一条记录
  slice_head(n = 1) %>%
  # 清理辅助列并按时间排序
  ungroup() %>%
  select(-date, -time_block) %>%
  arrange(dt)

方案2:滑动10分钟窗口去重(更贴合灵活间隔需求)

以上一条保留的记录时间为起点,往后10分钟内的记录全部删除,符合“每10分钟仅留1条”的动态需求:

library(dplyr)
library(lubridate)

final_df <- stack %>%
  # 按同个体、同位置、同日期分组
  group_by(i, l, date = as.Date(dt)) %>%
  # 组内按时间升序排列
  arrange(dt, .by_group = TRUE) %>%
  # 计算与上一条记录的时间差,第一条默认间隔超过600秒
  mutate(time_diff = as.numeric(difftime(dt, lag(dt, default = first(dt) - 601), units = "secs"))) %>%
  # 仅保留间隔超过等于10分钟的记录
  filter(time_diff >= 600) %>%
  # 清理辅助列
  ungroup() %>%
  select(-date, -time_diff) %>%
  arrange(dt)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:54:00