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

如何移除同组内60分钟内重复的相机陷阱检测数据?

移除相机陷阱数据中60分钟内的重复检测记录

针对你的需求——按Block/Site/Species分组,移除同一组内60分钟内重复出现的检测记录,以下是两种高效的R语言解决方案:

方法一:使用dplyr(适合常规数据量)

先将字符型的datetime转换为时间格式,再分组计算时间差并筛选符合条件的记录:

library(dplyr)

# 转换datetime为POSIXct时间格式
df$datetime <- as.POSIXct(df$datetime, format = "%Y-%m-%d %H:%M:%S")

# 分组筛选目标记录
df_cleaned <- df %>%
  # 按分组维度和时间排序,确保时间顺序正确
  arrange(Block, Site, Species, datetime) %>%
  # 按Block/Site/Species分组
  group_by(Block, Site, Species) %>%
  # 计算当前记录与上一条的时间差(单位:分钟),第一条记录的时间差设为0
  mutate(time_diff = difftime(datetime, lag(datetime, default = first(datetime)), units = "mins")) %>%
  # 保留组内第一条,或与上一条间隔≥60分钟的记录
  filter(time_diff >= 60 | row_number() == 1) %>%
  # 移除辅助计算列
  select(-time_diff) %>%
  ungroup()

# 查看清洗后的数据
print(df_cleaned)

方法二:使用data.table(适合大数据量)

如果你的数据集规模较大,data.table的处理速度会更高效:

library(data.table)

setDT(df)
# 转换时间格式
df[, datetime := as.POSIXct(datetime, format = "%Y-%m-%d %H:%M:%S")]

# 分组筛选
df_cleaned <- df[order(Block, Site, Species, datetime), 
                 .SD[difftime(datetime, shift(datetime, fill = first(datetime)), units = "mins") >= 60 | .I == .GRP],
                 by = .(Block, Site, Species)]

逻辑说明

两种方法的核心逻辑一致:

  1. 先按Block/Site/Species分组,确保只在同一维度内判断重复
  2. 对每组内的记录按时间排序,保证时间顺序正确
  3. 计算每条记录与上一条的时间差,筛选出间隔≥60分钟的记录,同时保留组内第一条记录(无论间隔)

运行代码后,输出结果将完全匹配你提供的期望输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:37:19