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

如何在R中高效计算数据框列的滑动三行均值?

高效计算数据框滚动3行均值的R方案

针对你处理大数据框、避免for循环的需求,这里有几个既简洁又高效的解决方案,完全不用手动写循环:

1. 使用zoo包的rollmean(最快最简洁)

zoo包的滚动统计函数是处理这类问题的首选,尤其是大数据量场景,底层用C实现,速度非常快。

先看代码示例:

# 加载包
library(zoo)

# 你的原始数据框
df <- data.frame(
  x = c(1,2,4,8,3,12),
  y = c(3,7,9,0,1,24)
)

# 计算滚动均值:窗口大小3,锚点在窗口左侧,超出范围填充NA
roll_means <- rollmean(df, k = 3, align = "left", fill = NA)

# 重命名结果列并合并原始数据
dfRes <- cbind(roll_means, df)
colnames(dfRes)[1:2] <- c("xRes", "yRes")

# 查看最终结果
dfRes

运行后得到的结果完全符合你的要求:

dfRes
xRes yRes x y
1 2.333333 6.333333 1 3
2 4.666667 5.333333 2 7
3 5.000000 3.333333 4 9
4 7.666667 8.333333 8 0
5 NA NA 3 1
6 NA NA 12 24

关键参数说明:

  • k=3:指定滚动窗口的大小为3行
  • align="left":将窗口的锚点设在左侧,确保每个均值对应窗口的第一行(完美匹配你要的xRes[1] = mean(x[1],x[2],x[3])规则)
  • fill=NA:当窗口超出数据范围时,自动填充NA

2. 使用dplyr + slider(tidyverse风格,灵活易用)

如果你习惯用tidyverse的语法,slider包提供了更直观的滚动操作API,性能同样出色:

library(dplyr)
library(slider)

dfRes <- df %>%
  mutate(
    # 对x列计算:当前行+后2行的均值,仅当窗口完整时返回结果
    xRes = slide_dbl(x, mean, .before = 0, .after = 2, .complete = TRUE),
    yRes = slide_dbl(y, mean, .before = 0, .after = 2, .complete = TRUE)
  ) %>%
  # 调整列顺序,和目标结果一致
  select(xRes, yRes, everything())

参数解释:

  • .before=0:不包含当前行之前的元素
  • .after=2:包含当前行之后的2个元素
  • .complete=TRUE:只有当窗口内的3行都存在时才计算均值,否则返回NA

3. Base R方案(无需额外依赖)

如果不想安装第三方包,用base R的filter函数也能实现,适合环境受限的场景:

# 定义滚动均值函数
roll_mean <- function(vec, window_size = 3) {
  n <- length(vec)
  # 生成窗口权重:每个元素权重为1/窗口大小
  weights <- rep(1/window_size, window_size)
  # 用filter计算滚动均值,sides=1表示仅从当前行向后取数据
  res <- filter(vec, weights, sides = 1)
  # 最后window_size-1个位置填充NA(因为无法形成完整窗口)
  res[(n - window_size + 2):n] <- NA
  return(res)
}

# 对数据框的每列应用函数,合并结果
dfRes <- data.frame(
  xRes = roll_mean(df$x),
  yRes = roll_mean(df$y),
  df
)

性能小贴士

对于超大数据框:

  • 优先选zoo的rollmean,速度最快,内存效率最高
  • slider的性能仅次于zoo,语法更灵活,适合复杂滚动逻辑
  • Base R方案胜在无依赖,但处理百万级行时速度会明显慢于前两者

内容的提问来源于stack exchange,提问作者Liv-Con

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:25:14