【问题标题】:Producing Rolling Averages Within A Data Set在数据集中生成滚动平均值
【发布时间】:2015-05-28 03:26:07
【问题描述】:

我有一个包含多个主题的大型数据集。我正在尝试为数据集中的一些变量创建一个滚动 5 天滚动平均值的新列。我一直在尝试使用 zoo 和 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 总是短一些(即,它开始将 5 天的滚动平均值放在第 3 天),这没有任何意义。

【问题讨论】:

    标签: r time-series


    【解决方案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")
    

    【讨论】:

    • 这很有帮助。我看到了代码的基本结构是如何工作的,之前对 RcppRoll 包并不熟悉。我使用 plyr 包中的 ddply 将代码应用于每个人,并且效果很好。
    【解决方案2】:

    rollapplyrollmean 默认情况下会产生居中的平均值,因此对于 width = 5fill = NA,人们会期望在开头和结尾有 2 个 NA,因为没有 5 个分量的序列在第一个、第二个、倒数第二个或最后一个位置。

    根据您的需要,您可以使用align = "right"rollapplyr 获得右对齐或align = "left" 获得左对齐。例如,对于右对齐,fill = NA 所有的 NA 都将出现在开头,因为没有 5 的序列在第一个、第二个、第三个或第四个位置结束。

    还取决于您想要尝试 rollapplypartial = TRUE 参数来获取在开头和/或结尾使用部分数据的方法。

    这在帮助页面?rollapply 和动物园附带的各种小插曲上进行了解释,那里也有示例。

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

    # center alignment, no fill
    rollmean(data$variable.1[1:10], 5)
    ## [1] 1182.4 1142.6 1117.2 1096.0 1189.2 1202.8
    
    # center alignment, fill
    rollmean(data$variable.1[1:10], 5, fill = NA)
    ## [1]     NA     NA 1182.4 1142.6 1117.2 1096.0 1189.2 1202.8     NA     NA
    
    # right alignment, fill
    rollmeanr(data$variable.1[1:10], 5, fill = NA)
    ## [1]     NA     NA     NA     NA 1182.4 1142.6 1117.2 1096.0 1189.2 1202.8
    
    # left alignment, fill
    rollmean(data$variable.1[1:10], 5, fill = NA, align = "left")
    ## [1] 1182.4 1142.6 1117.2 1096.0 1189.2 1202.8     NA     NA     NA     NA
    
    # right alignment, partial
    rollapplyr(data$variable.1[1:10], 5, mean, partial = TRUE)
    ## [1] 1369.000 1262.000 1174.333 1117.500 1182.400 1142.600 1117.200 1096.000
    ## [9] 1189.200 1202.800
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 2018-12-23
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多