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

