如何在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.8525Y[2:4]的内积是1101 + 0.95110 + 0.9025*112 = 306.58
最终结果是306.58/2.8525≈107.478,运行代码后mydata$Ydsc[1]就是这个值,说明计算没问题~
内容的提问来源于stack exchange,提问作者AllDoe_1
相关产品推荐
相关产品推荐

