【问题标题】:moving average on different size data frames in RR中不同大小数据帧的移动平均值
【发布时间】:2018-08-18 12:36:46
【问题描述】:

我有一组数据每 5 分钟采集一次,包含以下结构:

>df1 

Date                  X1
01/01/2017 0:00       1
01/01/2017 0:30       32
01/01/2017 1:00       65
01/01/2017 1:30       14
01/01/2017 2:00       25
01/01/2017 2:30       14
01/01/2017 3:00       85
01/01/2017 3:30       74
01/01/2017 4:00       74
01/01/2017 4:30       52
01/01/2017 5:00       25
01/01/2017 5:30       74
01/01/2017 6:00       45
01/01/2017 6:30       52
01/01/2017 7:00       21
01/01/2017 7:30       41
01/01/2017 8:00       74
01/01/2017 8:30       11
01/01/2017 9:00       2
01/01/2017 9:30       52

另一个向量只包含日期,但时间频率不同:

>V1

Date2
1/1/2017 1:30:00
1/1/2017 3:30:00
1/1/2017 5:30:00
1/1/2017 9:30:00

我想计算 X1 的移动平均值,但最后我真正需要的唯一值是与 V1 中的日期相关的值(但保留移动平均值生成的平滑)

您是否建议计算X1 的移动平均线,然后将该值与V1 中的相应日期相关联并重新应用移动平均线?或者你知道 R 中的一个函数可以帮助我实现这个吗?

谢谢你,非常感谢你的帮助!

索菲亚

【问题讨论】:

  • 您希望申请多少天/小时/分钟的移动平均线?
  • 嗯,实际上我有一个非常大的数据集,这只是其中的一小部分,所以我们在这个例子中使用了多少元素并不重要。我在下面看到了您的答案,您认为计算 df1 的移动平均值并将每个值与 V1 上的相应日期和时间简单关联是一个好方法吗?它会保持移动平均线的平滑吗?
  • 这取决于您的需要。我的回答考虑了 4 行的移动平均值(意味着 2 小时)。您可以尝试不同的periodsrollapply 的宽度),如 4 小时、8 小时等,以获得所需的结果。查看rollapply 的帮助。

标签: r dataframe moving-average


【解决方案1】:

filter 是构建移动平均线的便捷方式

假设您想要一个简单的算术移动平均线,您需要确定要一起平均多少个元素,以及您想要一个单边平均线还是双边平均线。随意,我会选择 5 和单面的。

elements <- 5
df1$x1.smooth <- filter(df1$X1, filter = rep(1/elements, elements), sides=1)

请注意,“moving.average”的 elements-1 元素将比 df1$X1 少,因为在有 elements 项要平均之前未定义移动平均线。

df1 现在是

              Date X1 x1.smooth
1  01/01/2017 0:00  1        NA
2  01/01/2017 0:30 32        NA
3  01/01/2017 1:00 65        NA
4  01/01/2017 1:30 14        NA
5  01/01/2017 2:00 25      27.4
6  01/01/2017 2:30 14      30.0
7  01/01/2017 3:00 85      40.6
8  01/01/2017 3:30 74      42.4
9  01/01/2017 4:00 74      54.4
10 01/01/2017 4:30 52      59.8
11 01/01/2017 5:00 25      62.0
12 01/01/2017 5:30 74      59.8
13 01/01/2017 6:00 45      54.0
14 01/01/2017 6:30 52      49.6
15 01/01/2017 7:00 21      43.4
16 01/01/2017 7:30 41      46.6
17 01/01/2017 8:00 74      46.6
18 01/01/2017 8:30 11      39.8
19 01/01/2017 9:00  2      29.8
20 01/01/2017 9:30 52      36.0

现在你只需要mergeDate = Date2 上的两个数据框或df1 的子集,其中Date%in% V1$Date2

【讨论】:

  • 您好,感谢您的帮助。您认为计算 df1 的移动平均值并简单地将每个值与 V1 上的相应日期和时间相关联是一个好方法吗?它会保持移动平均线的平滑吗?
【解决方案2】:

另一种选择是使用zoo 包。可以使用rollapply 计算并在数据框中添加另一列,该列将保持X1 的移动平均值。

宽度为4(每2小时)的移动平均值的实现可以实现为:

Library(zoo)
#Add another column with mean value
df$mean <- rollapply(df$X1, 4, mean, align = "right", fill = NA) 

df
   #                   Date X1  mean
   # 1  2017-01-01 00:00:00  1    NA
   # 2  2017-01-01 00:30:00 32    NA
   # 3  2017-01-01 01:00:00 65    NA
   # 4  2017-01-01 01:30:00 14 28.00
   # 5  2017-01-01 02:00:00 25 34.00
   # 6  2017-01-01 02:30:00 14 29.50
   # 7  2017-01-01 03:00:00 85 34.50
   # 8  2017-01-01 03:30:00 74 49.50
   # 9  2017-01-01 04:00:00 74 61.75
   # 10 2017-01-01 04:30:00 52 71.25
   # 11 2017-01-01 05:00:00 25 56.25
   # 12 2017-01-01 05:30:00 74 56.25
   # 13 2017-01-01 06:00:00 45 49.00
   # 14 2017-01-01 06:30:00 52 49.00
   # 15 2017-01-01 07:00:00 21 48.00
   # 16 2017-01-01 07:30:00 41 39.75
   # 17 2017-01-01 08:00:00 74 47.00
   # 18 2017-01-01 08:30:00 11 36.75
   # 19 2017-01-01 09:00:00  2 32.00
   # 20 2017-01-01 09:30:00 52 34.75

【讨论】:

    猜你喜欢
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 2017-11-12
    • 2018-11-14
    相关资源
    最近更新 更多