R语言实现:按Time变量筛选30分钟区间首行,删除符合条件的后续行
R 实现30分钟区间仅保留首行的筛选方法
前置注意
- 首先确保你的数据框已经按
Time列升序排序,若未排序先执行排序操作:
df <- df[order(df$Time), ]
方法1:基础R循环实现(逻辑直观,中小数据量适用)
逻辑为从第一行开始记录上一次保留的时间戳,逐行判断是否满足间隔大于等于1800秒,满足就保留并更新上一次保留的时间戳。
# 初始化保留行的索引,第一行默认保留 keep_idx <- 1 last_keep_time <- df$Time[1] # 逐行遍历判断 for (i in 2:nrow(df)) { current_time <- df$Time[i] if (current_time > last_keep_time + 1800) { keep_idx <- c(keep_idx, i) last_keep_time <- current_time } } # 提取结果 result_df <- df[keep_idx, ]
方法2:tidyverse 风格实现(适合tidy生态用户)
用purrr::accumulate实现累积判断,代码更简洁:
library(dplyr) library(purrr) result_df <- df %>% arrange(Time) %>% # 先保证时间升序 mutate( # 累积计算每个分组的起始时间标记 group_mark = accumulate(Time, ~ifelse(.y > .x + 1800, .y, .x)) ) %>% # 每个分组只保留第一行 distinct(group_mark, .keep_all = TRUE) %>% select(-group_mark) # 删除辅助列
示例数据测试结果
你给出的示例数据中6行的Time最大间隔仅为300秒,远小于1800秒的阈值,所以运行后仅会保留第一行数据。
内容的提问来源于stack exchange,提问作者Davide Piffer
相关产品推荐
相关产品推荐

