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

R语言鱼类遥测数据按温度阈值按个体过滤后续观测的实现方法

实现方案

核心过滤逻辑如下:

  • 按TAG分组,对每个个体提取所有温度传感器记录,找到首次温度≥30℃的时间点作为该个体的观测截止时间
  • 若个体从未出现温度超30℃的情况,保留该个体全部观测
  • 仅保留每个TAG所有早于其截止时间的温度、深度传感器记录

dplyr 实现(代码简洁易读)

library(dplyr)

df_filtered <- df %>%
  group_by(TAG) %>%
  # 计算当前TAG首次温度超过30℃的时间,无符合记录时返回Inf
  mutate(cutoff_time = min(DATE.TIME[SENSOR == "temp" & SENSOR.VALUE >= 30], na.rm = T)) %>%
  # 处理无超温记录的个体,将截止时间设为晚于所有观测时间
  mutate(cutoff_time = ifelse(is.infinite(cutoff_time), max(DATE.TIME) + 1, cutoff_time)) %>%
  # 仅保留截止时间前的记录
  filter(DATE.TIME < cutoff_time) %>%
  ungroup() %>%
  # 移除辅助计算的截止时间列
  select(-cutoff_time)

原生R实现(无需加载额外依赖包)

# 先为每个TAG计算观测截止时间
cutoff_list <- tapply(seq_len(nrow(df)), df$TAG, function(idx) {
  sub_data <- df[idx, ]
  over_temp_time <- sub_data$DATE.TIME[sub_data$SENSOR == "temp" & sub_data$SENSOR.VALUE >= 30]
  if (length(over_temp_time) == 0) {
    # 无超温记录时返回晚于所有观测的时间
    return(max(sub_data$DATE.TIME) + 1)
  } else {
    return(min(over_temp_time))
  }
})

# 匹配每个TAG的截止时间,完成过滤
df_filtered <- df[df$DATE.TIME < cutoff_list[as.character(df$TAG)], ]

两种方案运行后输出的结果与你提供的期望过滤数据集完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:36:03