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

R使用slider包对按GaugeID分组的水文数据计算10年移动平均报错求助

slider包分组计算10年移动平均报错解决方案

错误原因

  • mean函数误用公式语法:mean(Precip ~ Et, .x)属于无效写法,mean本身不支持公式作为入参,这是触发“参数非数值/逻辑值”报错的核心原因。如果你是要计算Precip与Et比值的均值,或者某一列的均值,需要调整写法;如果是要计算滑动窗口内的回归系数,应该搭配lm使用。
  • 滑动函数类型不匹配:你计算的结果为浮点型数值,应该使用slide_dbl()而非要求返回整数的slide_int()。
  • 入参冗余:如果仅计算单列的滑动平均,无需传入cur_data(),直接传入目标列向量即可,代码更简洁。

修正代码示例

场景1:计算单列10年移动平均(以Precip为例)

该写法会自动在每个GaugeID分组内单独计算,前9条记录自动返回NA,符合你的需求:

library(tidyverse)
library(slider)

test <- elasticity %>% 
  group_by(GaugeID) %>% 
  mutate(decade_precip_avg = slide_dbl(
    .x = Precip,
    .f = mean,
    .before = 9,
    .complete = TRUE
  ))

场景2:批量计算所有数值列的10年移动平均

如果需要同时计算Precip、Temp、Pet、Et四列的10年均值,可通过across批量处理:

test <- elasticity %>% 
  group_by(GaugeID) %>% 
  mutate(across(c(Precip, Temp, Pet, Et),
                ~slide_dbl(.x = .x,
                           .f = mean,
                           .before = 9,
                           .complete = TRUE),
                .names = "{.col}_decade_avg"))

场景3:计算滑动窗口内Precip对Et的回归斜率

如果你原来写的公式是要计算每10年窗口内Precip~Et的回归系数,可使用如下写法:

test <- elasticity %>% 
  group_by(GaugeID) %>% 
  mutate(decade_reg_slope = slide_dbl(
    .x = cur_data(),
    .f = ~coef(lm(Precip ~ Et, data = .x))[[2]],
    .before = 9,
    .complete = TRUE
  ))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:18:04