12

我想知道如何计算某些数字的累积平均值。我将举一个简单的例子来描述我在寻找什么。

我有以下号码

vec <- c(1, 2, 3, 4, 5)

如果我对这些数字进行平均,我将得到 3。

现在,如何计算这些数字的累积平均值。

4

7 回答 7

22

类似于列表的累积总和,我建议:向量x的累积平均avg将包含从第一个位置到位置i的平均值。

一种方法是通过对所有先前值求和并除以它们的数量来计算每个位置的平均值。

通过将算术平均值的定义重写为递归公式。一个得到

avg(1) = x(1)

avg(i) = (i-1)/i*avg(i-1) + x(i)/i;    (i > 1)

为向量的每个元素(或列表、一维数组,或者你怎么称呼它)评估这个表达式会给你累积平均值。

如果您必须计算非常大或非常多的整数的平均值,并且如果您必须存储它们的累积和,则会遇到溢出,这种递归方法会派上用场。

例子

在你的例子中

1, 2, 3, 4, 5

我们得到

1, 1.5, 2, 2.5, 3
于 2013-07-26T13:33:20.293 回答
9

这是一个老问题,从那时起发生了很多变化。我只是想用dplyr答案更新它。dplyr有一个cummean函数直接给出向量的累积平均值。

vec <- c(1, 2, 3, 4, 5)
library(dplyr)
cummean(vec)

#[1] 1.0 1.5 2.0 2.5 3.0
于 2017-06-26T13:34:56.737 回答
8

问题如何在 R 中创建累积平均值?回答:这个答案是由 Jim Holtman jholtman@gmail.com 提供的。他使用了这个cumsum()函数,seq_along()所以阅读了这些函数。但是提供的代码清楚地表明了这一点。6、6 + 16、6 + 16 + 8 等等

   x <- sample(1:20)
    x
 # [1]  6 16  8  1 17 11  2 19 18  5 15 13  3 20  9 14  7 10 12  4

    cumsum(x) / seq_along(x)
 # [1]  6.000000 11.000000 10.000000  7.750000  9.600000  9.833333  8.714286
 #10.000000 10.888889 10.300000
 #[11] 10.727273 10.916667 10.307692 11.000000 10.866667 11.062500 10.823529
 #10.777778 10.842105 10.500000
于 2014-08-08T19:35:04.657 回答
6

只需保持数字的运行总和,以及它们的运行计数。平均值只是计数的总和。

于 2012-06-17T20:48:42.637 回答
2

这个问题表明严重缺乏研究,但我还没有足够的声誉来否决这个问题。如果我正确理解了这个问题,那么需要的是累积移动平均线。

维基百科非常清楚地描述了累积移动平均线。我不允许在此处发布图片,但请按照该链接获取一个简单的公式(先前平均值和新值的加权平均值)。

于 2012-12-13T14:57:47.467 回答
0

我做了一个简单的 C++ 类。

#include <iostream>

using namespace std;

class Average {

public:
    Average(const double initVal=0.0){accumVal=initVal;}
    double getAverage(const double newVal) {

        accumVal += newVal;
        return accumVal / ++numAccumVal;
    }
    void clear(const double clearedVal=0.0) {

        accumVal = clearedVal;
        numAccumVal = 0;
    }
private:
    double accumVal;
    unsigned int numAccumVal=0;
};

int main(int argc, const char * argv[]) {

    Average avg;

    for (size_t i=1; i<=5; ++i) { //feed in 1 to 5

        double result = avg.getAverage(i);
        cout << "Result : " << result << endl; //print the result
    }
    return 0;
}

如果你运行代码,你会得到如下结果。

Result : 1
Result : 1.5
Result : 2
Result : 2.5
Result : 3
Program ended with exit code: 0
于 2017-07-10T12:56:29.203 回答
0
mynum
#[1] 1 2 3 4 5

cumsum(mynum)/seq(from=1, to=5)
#[1] 1.0 1.5 2.0 2.5 3.0
于 2016-03-22T14:00:53.313 回答