如何在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
相关产品推荐
相关产品推荐

