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

