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

如何在R中对数据框所有行应用带求和的加权计算生成新列?

解决R中滑动加权平均计算的问题

嘿,我来帮你搞定这个滑动加权平均的计算!咱们先从基础步骤开始:

首先,先把你的示例数据框在R里还原出来:

mydata <- data.frame(
  Y = c(100, 101, 110, 112, 114, 120),
  N = c(1, 0.95, 0.9025, 0.8573, 0.8145, 0.7737),
  s = 1:6
)

你要实现的是窗口大小k=3的滑动加权平均:用N列的连续k个值做权重,和Y列往后偏移一位的连续k个值做内积,再除以权重的总和。下面给你两种实用的实现方法:

方法一:Base R循环实现(无额外包依赖)

这种方法逻辑直白,不需要加载第三方包,适合新手理解:

k <- 3
mydata$Ydsc <- NA  # 先初始化新列为空值

# 循环计算每个有效的窗口结果
for (t in 1:(nrow(mydata) - k)) {
  # 提取当前窗口的N值
  n_window <- mydata$N[t:(t + k - 1)]
  # 提取对应偏移一位的Y值
  y_window <- mydata$Y[(t + 1):(t + k)]
  # 计算加权平均并赋值
  mydata$Ydsc[t] <- crossprod(n_window, y_window) / sum(n_window)
}

运行后,mydata$Ydsc的前几行就会得到你要的结果:第一行对应crossprod(N[1:3], Y[2:4])/sum(N[1:3]),第二行对应crossprod(N[2:4], Y[3:5])/sum(N[2:4]),最后两行因为窗口长度不够会保留NA。

方法二:用zoo包简化滑动窗口计算(更高效)

如果经常处理滑动窗口类的任务,zoo包的rollapply能帮你省去循环,代码更简洁:

先安装并加载包:

install.packages("zoo")
library(zoo)

然后一行代码完成计算:

k <- 3
mydata$Ydsc <- rollapply(
  data = mydata,
  width = k + 1,  # 因为要同时取N的k个值和Y的k个偏移值,总窗口长度为k+1
  FUN = function(x) {
    n_vals <- x[1:k, "N"]
    y_vals <- x[2:(k+1), "Y"]
    crossprod(n_vals, y_vals) / sum(n_vals)
  },
  by.column = FALSE,  # 需同时处理多列,不能按列单独滑动
  align = "left"      # 窗口左对齐,对应你需要的计算顺序
)

手动验证结果

咱们算第一行确认下:
N[1:3]的和是1+0.95+0.9025=2.8525
Y[2:4]的内积是1101 + 0.95110 + 0.9025*112 = 306.58
最终结果是306.58/2.8525≈107.478,运行代码后mydata$Ydsc[1]就是这个值,说明计算没问题~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:42:20