R语言如何计算另一dataframe中各峰值区间的平均exposure
计算峰值区间平均暴露值的实现方法
pracma::findpeaks()返回的结果矩阵中,第3列、第4列直接存储了每个峰值在原数据集的起始行索引、结束行索引,不需要额外做时间字符串匹配,直接按行范围切片计算均值即可,计算效率更高。
方法1:基于原生行索引计算(推荐,适合连续无缺失的等间隔时间序列)
直接遍历峰值结果矩阵,按行索引截取对应区间的exposure值计算均值,代码如下:
# 计算每个峰值区间的平均exposure peak_info$avg_exposure <- apply(peak, 1, function(row) { start <- row[3] end <- row[4] mean(data$exposure[start:end]) })
方法2:基于时间区间匹配计算(适合手动调整过峰值区间、时间序列有缺失的场景)
如果你后续手动修改过peak_info里的起止时间,或者原时间序列存在缺失值,可以先把时间字段转为时间类型,再按时间范围匹配数据计算:
# 统一转换为POSIXct时间类型用于区间比较 data$time_pos <- as.POSIXct(data$time_min, format = "%H:%M:%S", tz = "UTC") peak_info$start_pos <- as.POSIXct(peak_info$peak_start, format = "%H:%M:%S", tz = "UTC") peak_info$end_pos <- as.POSIXct(peak_info$peak_end, format = "%H:%M:%S", tz = "UTC") # 按时间区间匹配计算均值 peak_info$avg_exposure <- apply(peak_info, 1, function(p) { hit <- which(data$time_pos >= p[["start_pos"]] & data$time_pos <= p[["end_pos"]]) mean(data$exposure[hit]) })
结果验证
用提供的示例数据运行上述代码,得到3个峰值区间的平均暴露值分别为:
- 第一个峰值(08:19:02 ~ 08:19:04):均值约3.33
- 第二个峰值(08:19:07 ~ 08:19:09):均值5
- 第三个峰值(08:19:16 ~ 08:19:17):均值4.5
和手动核算的结果完全一致。
内容的提问来源于stack exchange,提问作者Miquel Vallbona
相关产品推荐
相关产品推荐

