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

多分组连续测点梯度计算:R语言实现CO2时间序列6点负梯度提取

多房间CO₂浓度负梯度批量提取实现方案

需求背景

1年时间内对400个房间每5分钟采集一次CO₂浓度数据,每个房间对应独立时间序列,单房间测量数据量约10万条,所有数据为长格式堆叠存储。需要对每个房间的时间序列计算每6个连续测点(对应30分钟时长)的线性拟合梯度,返回所有出现负梯度的对应数值。
负梯度效果示例:
负梯度示例

现有参考代码

依赖加载

require(dplyr)

测试模拟数据

长格式模拟数据

n <- 100
dat <- expand.grid(t=seq(0, by=5, length.out=n), room_id=1:3)
dat <- cbind(dat, co2=runif(nrow(dat), 250, 2000))

单向量测试数据

co2=c(100,200,150,99,78,50)

梯度计算函数

check_6_negative<-function(pts){
  df<-data.frame(co2=pts,t=1:NROW(pts))
  lm(data=df,co2~t)$coefficients["t"]
}

已有测试调用

  • 单组点测试调用:check_points(co2)
  • 分组处理尝试代码:
purrr::map_df(runif(60) %>% split(1:10),check_6_negative)

优化实现方案

采用dplyr+slider的滑动窗口方案,性能远高于手动拆分序列计算,适配百万级数据量的处理需求,同时保证代码简洁易维护:

  1. 先安装缺失依赖(首次运行需要):install.packages(c("dplyr", "slider", "purrr"))
  2. 完整处理代码:
library(dplyr)
library(slider)
library(purrr)

result <- dat %>%
  # 按房间分组,且按时间排序保证序列顺序正确
  group_by(room_id) %>%
  arrange(t, .by_group = TRUE) %>%
  # 滑动窗口计算每6个连续点的梯度,仅保留完整窗口结果
  mutate(
    gradient = slide_dbl(
      co2,
      ~ check_6_negative(.x),
      .before = 5, # 取当前点+前5个点,刚好组成6个点的窗口
      .complete = TRUE
    )
  ) %>%
  ungroup() %>%
  # 筛选所有负梯度记录
  filter(gradient < 0)

如果需要进一步提升计算速度,可以替换梯度计算逻辑,避免lm的额外开销,直接用最小二乘公式计算斜率,性能可提升5~10倍:

# 高性能梯度计算函数
calc_slope <- function(pts) {
  n <- length(pts)
  t <- 1:n
  cov(pts, t) / var(t)
}

把slide_dbl中的函数替换为calc_slope即可直接使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:06:03