我有一个包含多个主题的大型数据集。我正在尝试为数据集中的一些变量创建一个滚动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天滚动平均值),这没有任何意义。
答案 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)
rollapply
和rollmean
生成居中的方法,因此width = 5
和fill = NA
会在开头和结尾处预期有2个NAs,因为没有序列5个组件,在第一个,第二个,倒数第二个或最后一个位置具有中间值。
根据您的需要,您可以使用align = "right"
或rollapplyr
进行正确对齐,或align = "left"
进行左对齐。例如,在右对齐的情况下,fill = NA
所有的NA都会出现在开头,因为没有5的序列在第一,第二,第三或第四位置结束。
另外,根据您的需要,尝试partial = TRUE
的{{1}}参数,以获得在开头和/或结尾使用部分数据的方法。
这在帮助页面rollapply
以及动物园附带的各种小插图中有解释,也有例子。
以下是您的数据的一些变体示例:
?rollapply