【问题标题】:Incrementally mean for list of vectors向量列表的增量平均值
【发布时间】:2017-11-08 18:06:24
【问题描述】:

我有一个向量,我想取向量的增量平均值。

a <- 2 4 6 2 4 0 1 0 0 1

这行得通:

for(i in seq_along(a)) {
    print(mean(a[1:seq_along(a)[[i]]]))
    }
[1] 2
[1] 3
[1] 4
[1] 3.5
[1] 3.6
[1] 3
[1] 2.714286
[1] 2.375
[1] 2.111111
[1] 2

但现在我想将其扩展到向量列表,但我被卡住了。

b <- list(x = rnorm(10, mean = 5), x2 = rnorm(10, mean = 20))
b
$x
 [1] 4.893252 5.129610 4.599701 5.409024 4.666844 5.787243 5.697621 2.968771 5.216302 6.268629

$x2
 [1] 19.50947 22.14797 20.80683 19.47857 21.24126 18.36233 20.57424 19.68233 20.67508 19.83930

当我尝试这个时,我得到以下信息:

for(i in seq_along(b)) {
     print(mean(b[[i]][1:seq_along(b[[i]])[[i]]]))
}
[1] 4.893252
[1] 20.82872

它应该返回两个向量,显示每个索引的平均值,就像前面的例子一样,而不是向量本身的总平均值

我不知道如何继续。在此先感谢您的帮助。

【问题讨论】:

    标签: r vectorization


    【解决方案1】:

    与其使用 for 循环,不如使用 cumsum() 和除法来计算累积平均值。例如

    cummean <- function(x) cumsum(x)/seq_along(x)
    

    那你就可以了

    cummean(a)
    

    或者用一个列表

    lapply(b, cummean)
    

    【讨论】:

    • dplyr::cummean
    • 钱! @akrun 我很高兴这个解决方案就在那里,并勾选我不知道它。谢谢。
    【解决方案2】:

    这适合你吗?

    set.seed(1)
    b <- list(x = rnorm(10, mean = 5), x2 = rnorm(10, mean = 20))
    lapply(b, function(x) cumsum(x) / seq_along(x))
    

    【讨论】:

      猜你喜欢
      • 2014-08-20
      • 2021-12-04
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多