如何在R中按组计算移动平均线(附实例)

511 阅读1分钟

在时间序列分析中,移动平均数代表了之前一定数量时期的平均值。

你可以使用下面的基本语法在R中按组计算移动平均线:

library(dplyr)
library(zoo)

#calculate moving average by group
df %>%
  group_by(variable1)
  mutate(moving_avg = rollmean(variable2, k=3, fill=NA, align='right'))

这个特殊的例子计算了变量2的3期移动平均线,按变量1分组。

这段代码利用了dplyr包的 group_by()函数和zoo包的**rollmean()**函数。

下面的例子展示了如何在实践中使用这个函数。

例子:在R中按组计算移动平均数

假设我们在R中拥有以下数据框,显示了某种产品在两个不同商店连续几天的销售情况:

#create data frame
df <- data.frame(store=rep(c('A', 'B'), each=7),
                 sales=c(4, 4, 3, 5, 6, 5, 7, 4, 8, 7, 2, 5, 4, 6))

#view data frame
df

   store sales
1      A     4
2      A     4
3      A     3
4      A     5
5      A     6
6      A     5
7      A     7
8      B     4
9      B     8
10     B     7
11     B     2
12     B     5
13     B     4
14     B     6

我们可以使用下面的语法来创建一个名为moving_avg3的新列,显示每个商店销售的3天移动平均数值:

library(dplyr)
library(zoo)

#calculate 3-day moving average of sales, grouped by store
df %>%
  group_by(store) %>%
  mutate(moving_avg3 = rollmean(sales, k=3, fill=NA, align='right'))

# A tibble: 14 x 3
# Groups:   store [2]
   store sales moving_avg3
           
 1 A         4       NA   
 2 A         4       NA   
 3 A         3        3.67
 4 A         5        4   
 5 A         6        4.67
 6 A         5        5.33
 7 A         7        6   
 8 B         4       NA   
 9 B         8       NA   
10 B         7        6.33
11 B         2        5.67
12 B         5        4.67
13 B         4        3.67
14 B         6        5

注意rollmean()函数中的k值控制了用于计算移动平均数的前几个时期。

moving_avg3列显示了前3个时期的销售的移动平均值。

例如,A店的第一个3天的销售移动平均值的计算方法是:

3天移动平均值=(4+4+3)/3=3.67

A商店下一个3天的销售平均数的计算方法是:

3天移动平均线=(4+3+5)/3=4

以此类推。

请注意,每个商店的移动平均数的前两个值是NA,因为没有足够的以前的时期用于移动平均数。