在时间序列分析中,移动平均数代表了之前一定数量时期的平均值。
你可以使用下面的基本语法在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,因为没有足够的以前的时期用于移动平均数。