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

R语言计算数据框滚动均值及rollapply报错解惑

嗨,我来帮你解决这个滚动均值的问题~

首先明确说:基础R里没有专门计算滚动均值的内置函数,不过我们可以用扩展包轻松实现。你尝试的rollapply是zoo包里的常用工具,报错的原因很简单——你漏了必须指定的width参数,我来给你详细拆解:

关于width参数的含义

这个参数定义了滚动窗口的大小,也就是每次计算均值时要包含多少行数据。举个例子:

  • 如果width=3,就是计算当前行 + 前两行的均值;
  • 如果width=2,就是当前行 + 前一行的均值;
  • 你可以根据需求设置窗口大小,这个参数是rollapply的必填项,不指定就会触发报错。

具体实现示例

先构造和你类似的数据框:

# 模拟你的数据
s <- data.frame(
  Value = c(1, 78, 97, 56, 32),
  Id = c("xxx-rrr-ttt", "ggg-oop-rty", "fad-dar-oki", "abc-def-ghi", "jkl-mno-pqr")
)

方法1:用zoo包的rollapply

首先安装并加载zoo包,然后指定窗口大小和对齐方式:

install.packages("zoo") # 首次使用需要安装
library(zoo)

# 计算窗口大小为2的滚动均值,对齐到当前行(right表示结果对应窗口的最后一行)
s$rolling_mean <- rollapply(
  s$Value, 
  width = 2, 
  FUN = mean, 
  align = "right", 
  fill = NA # 窗口不完整的行(比如第一行)用NA填充
)

如果想更简便,zoo还有专门的rollmean函数,是rollapply针对均值的简化版:

s$rolling_mean <- rollmean(s$Value, k = 2, align = "right", fill = NA)

方法2:用dplyr+slider的管道风格

如果你习惯用tidyverse的语法,可以用slider包的slide_dbl:

install.packages(c("dplyr", "slider"))
library(dplyr)
library(slider)

s <- s %>%
  mutate(
    rolling_mean = slide_dbl(
      Value, 
      mean, 
      .before = 1, # 包含当前行之前的1行,总共2行窗口
      .complete = FALSE # 允许窗口不完整,第一行会返回自身的均值;设为TRUE则返回NA
    )
  )

补充说明

  • align参数:right表示结果对应窗口的最后一行(也就是当前行),left对应窗口第一行,center对应窗口中间行,根据你的需求选择;
  • fill参数:用来处理窗口不完整的行(比如前n-1行,n是窗口大小),可以设为NA、0或者其他你需要的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:23:22