首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R-累积平均结合weighted.mean

R-累积平均结合weighted.mean
EN

Stack Overflow用户
提问于 2016-11-29 09:34:47
回答 1查看 335关注 0票数 1

问题是相当直截了当的,对解决办法并不确定。我试图做的示例代码是:

代码语言:javascript
复制
library(dplyr)
# initialize a
a = c(5, 6, 8, 9, 10, 15, 7, 9)

# run cummean from dplyr, result
round(cummean(a), digits = 2)

[1] 5.00 5.50 6.33 7.00 7.60 8.83 8.57 8.62

# run weighted.mean from base r, with weights passed as 2nd param
weighted.mean(a, seq(1, length(a), by = 1) / sum(seq(1, length(a), by = 1)))

[1] 9.388889

这里我的问题有点不同。我想计算一个按不同权重加权的累积向量。为了显示我自己的功能,并了解我想要的结果:

代码语言:javascript
复制
round(weighted.cummean(a), digits = 2)

[1] 5.00, 5.67, 6.83, 7.70, 8.47, 10.33, 9.50, 9.39

有关如何计算这些值的参考,可以使用循环中的weighted.mean为每个计算运行这个For -循环:

代码语言:javascript
复制
b = c()
for(i in 1:length(a)) {
  weights = seq(1, i, by = 1) / sum(seq(1, i, by = 1))
  b = c(b, weighted.mean(a[1:i], weights))
}

我想我的问题总结为-我们是否可以将weighted.mean for-循环转换为使用累积均值或类似于累积均值的函数的1行代码?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-29 09:48:23

试试看:

代码语言:javascript
复制
w <- seq_along(a)

cumsum(a * w) / cumsum(w)
## [1]  5.000000  5.666667  6.833333  7.700000  8.466667 10.333333  9.500000  9.388889

sapply(seq_along(a), function(i) weighted.mean(head(a, i), head(w, i)))
## [1]  5.000000  5.666667  6.833333  7.700000  8.466667 10.333333  9.500000  9.388889

out <- a; for(i in seq_along(a)) out[i] <- weighted.mean(head(a, i), head(w, i)); out
## [1]  5.000000  5.666667  6.833333  7.700000  8.466667 10.333333  9.500000  9.388889

library(dplyr)
cummean(a * w) / cummean(w)
## [1]  5.000000  5.666667  6.833333  7.700000  8.466667 10.333333  9.500000  9.388889

library(zoo)
rollapplyr(a, seq_along(a), function(x) weighted.mean(x, head(w, length(x))))
## [1]  5.000000  5.666667  6.833333  7.700000  8.466667 10.333333  9.500000  9.388889
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40862269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档