在数据集中生成滚动平均值

时间:2015-05-28 03:26:08

标签: r time-series

我有一个包含多个主题的大型数据集。我正在尝试为数据集中的一些变量创建一个滚动5天滚动平均值的新列。我一直在尝试使用动物园和dplyr包,但我似乎无法让它出来正确。我试图弄清楚如何将NA放在前5行的空白区域中。

数据看起来像这样:

set.seed(362)
Day <- rep(seq(1:35), times = 3)
variable.1 <- round(rnorm(n = Day, mean = 1200, sd = 300),0)
variable.2 <- round(rnorm(n = Day, mean = 100, sd = 20), 0)
variable.3 <- round(rnorm(n = Day, mean = 20, sd = 5), 1)
data <- data.frame(Day, variable.1, variable.2, variable.3)
Bob <- sample("Bob", 35, replace = T)
Jeff <- sample("Jeff", 35, replace = T)
Kevin <- sample("Kevin", 35, replace = T)
Names <- array(c(Bob, Jeff, Kevin), dim = c(105,1))
data <- cbind(Names, data)
data

     Name  Day  variable.2   variable.2  variable.3
1     Bob   1       1369         91       20.6
2     Bob   2       1155         96       18.8
3     Bob   3        999         97       22.4
4     Bob   4        947         93       11.4
5     Bob   5       1442         90       20.1
6     Bob   6       1170        125       17.8
7     Bob   7       1028         81       16.0
8     Bob   8        893        115       30.6
9     Bob   9       1413         76       18.2
10    Bob  10       1510        126       18.8
11    Bob  11       1145        117       19.7
12    Bob  12       1893         83       11.0
13    Bob  13       1559        122       21.9
14    Bob  14       1396         91       27.4
15    Bob  15       1066        105       29.2
16    Bob  16       1319         31       31.4
17    Bob  17        959        134       25.0
18    Bob  18       1325        108       11.8
19    Bob  19       1278         93       17.0
20    Bob  20        909         70       16.2
21    Bob  21        777         84       23.3
22    Bob  22       1770        105       11.6
23    Bob  23       1080         79       14.6
24    Bob  24        855         70       18.7
25    Bob  25       1192         84       15.1
26    Bob  26       1077        116       18.6
27    Bob  27       1376        120       19.6
28    Bob  28       1290        107       20.8
29    Bob  29       1150         96       16.4
30    Bob  30        991        111       22.0
31    Bob  31       1433        113       16.0
32    Bob  32       1125        104       17.8
33    Bob  33       1076        122       21.6
34    Bob  34       1491        113       24.1
35    Bob  35       1163        102       20.0
36   Jeff   1       1151         75       19.4
37   Jeff   2       1375         87       24.7
38   Jeff   3       1508        106       19.1
39   Jeff   4       1569         84       15.4
40   Jeff   5       1279         88       13.5
41   Jeff   6        664        116       21.1
42   Jeff   7        987         69       24.7
43   Jeff   8       1913        121       20.6
44   Jeff   9       1320         99       17.4
45   Jeff  10       1384        126       25.6
46   Jeff  11       1067        118       22.6
47   Jeff  12       1060         81       20.9
48   Jeff  13       1732         97       19.5
49   Jeff  14       1097        112       17.1
50   Jeff  15       1521        105       13.4
51   Jeff  16       1139        123       19.0
52   Jeff  17        996         99       20.8
53   Jeff  18        713        127       27.0
54   Jeff  19       1586         91       15.4
55   Jeff  20        777        119       17.7
56   Jeff  21       1232        106       22.4
57   Jeff  22       1415        116       25.9
58   Jeff  23       1256        117       23.1
59   Jeff  24        955         97       24.3
60   Jeff  25       1503        105       21.1
61   Jeff  26       1965         80       17.6
62   Jeff  27       1281        112       29.7
63   Jeff  28       1467        122       23.8
64   Jeff  29        939        118       17.4
65   Jeff  30       1288         91       20.9
66   Jeff  31       1441         99       16.6
67   Jeff  32       1310         75       23.2
68   Jeff  33       1155        112       22.9
69   Jeff  34       1357         94       29.0
70   Jeff  35       1378         81       26.6
71  Kevin   1       1185         70       16.8
72  Kevin   2       1709        115       24.2
73  Kevin   3       1050        111       10.5
74  Kevin   4       1474        104       10.7
75  Kevin   5       1016         75       20.4
76  Kevin   6        630         98       18.6
77  Kevin   7        949         53       16.4
78  Kevin   8       1284        118       16.6
79  Kevin   9       1255         87        7.7
80  Kevin  10        406        105       14.1
81  Kevin  11       1182        110       16.8
82  Kevin  12        803         73       27.7
83  Kevin  13        960         84       20.3
84  Kevin  14       1192         91       20.6
85  Kevin  15        749        104       22.2
86  Kevin  16        848        106       17.2
87  Kevin  17       1567         77       12.4
88  Kevin  18       1026        127       19.3
89  Kevin  19       1384         93       19.4
90  Kevin  20       1024         96       17.1
91  Kevin  21       1226        105       12.6
92  Kevin  22       1629        110       10.1
93  Kevin  23       1197         64       24.1
94  Kevin  24       1286         82       17.0
95  Kevin  25       1104        103       26.2
96  Kevin  26       1056        108       25.1
97  Kevin  27       1481        145       10.7
98  Kevin  28        949        124       18.8
99  Kevin  29       1230        152       13.5
100 Kevin  30       1481         78       15.4
101 Kevin  31       1437         83       25.0
102 Kevin  32       1446         81       21.3
103 Kevin  33       1501        101       20.0
104 Kevin  34       1288        103       17.8
105 Kevin  35       1338        109       25.0

当我使用rollapply和rollmean并指出我想要滚动的天数,5和fill = NA时,它似乎总是在前几行添加一个NA,在底部几行添加一个NA。然而,前几行中的NA总是短暂的(IE,它开始在第3天推出5天滚动平均值),这没有任何意义。

2 个答案:

答案 0 :(得分:1)

如果您使用旨在有效执行这些操作的RcppRoll包,则有一个简单的解决方案。

library(RcppRoll)
data$v1roll <- c(rep(NA, 4), roll_mean(data$variable.1, 5))

data$v1roll <- roll_mean(data$variable.1, 5, fill=NA, align="right")

答案 1 :(得分:1)

默认情况下,

rollapplyrollmean生成居中的方法,因此width = 5fill = NA会在开头和结尾处预期有2个NAs,因为没有序列5个组件,在第一个,第二个,倒数第二个或最后一个位置具有中间值。

根据您的需要,您可以使用align = "right"rollapplyr进行正确对齐,或align = "left"进行左对齐。例如,在右对齐的情况下,fill = NA所有的NA都会出现在开头,因为没有5的序列在第一,第二,第三或第四位置结束。

另外,根据您的需要,尝试partial = TRUE的{​​{1}}参数,以获得在开头和/或结尾使用部分数据的方法。

这在帮助页面rollapply以及动物园附带的各种小插图中有解释,也有例子。

以下是您的数据的一些变体示例:

?rollapply