使用 dplyr 包按时间平均 - R

Posted

技术标签:

【中文标题】使用 dplyr 包按时间平均 - R【英文标题】:Averaging by time using dplyr package - R 【发布时间】:2014-12-28 10:22:57 【问题描述】:

我尝试根据 5 分钟组对数据集进行平均。如示例所示,我正在使用 dplyr:

library(zoo)
library(xts)
library(dplyr)

t1 <- as.POSIXct("2012-1-1 0:0:0") 
t2 <- as.POSIXct("2012-1-1 1:0:0") 
d <- seq(t1, t2, by = "1 min") 
x <- rnorm(length(d)) 
z <- cbind.data.frame(d,x)

z %>%
  group_by(d = cut(d, breaks="5 min")) %>%
  summarize(x = mean(x))

这是 0:0:0 到 0:4:0 的平均值,存储为时间戳 0:0:0。但是,我要求时间戳为 0:5:0、0:10:0、0:15:0 等,并且与这些时间戳对应的平均值为 0:1:0 - 0:5:0, 0 :6:0 - 0:10:0, 0:11:00 - 0:15:0。

是否有一个简单的调整来获得这个?

【问题讨论】:

使用lubridate::floor_date 【参考方案1】:

一种方法是明确指定中断和标签。例如:

# Create 5-minute breakpoints at 1,6,11,... minutes past the hour.
breaks=seq(as.POSIXct("2011-12-31 23:56:00"), 
           as.POSIXct("2012-01-01 01:05:00"), by="5 min")

> breaks
 [1] "2011-12-31 23:56:00 PST" "2012-01-01 00:01:00 PST" "2012-01-01 00:06:00 PST" "2012-01-01 00:11:00 PST"
 [5] "2012-01-01 00:16:00 PST" "2012-01-01 00:21:00 PST" "2012-01-01 00:26:00 PST" "2012-01-01 00:31:00 PST"
 [9] "2012-01-01 00:36:00 PST" "2012-01-01 00:41:00 PST" "2012-01-01 00:46:00 PST" "2012-01-01 00:51:00 PST"
[13] "2012-01-01 00:56:00 PST" "2012-01-01 01:01:00 PST"

# Setting the labels to breaks - 60 subtracts 1 minute to each value in breaks, 
# so the labels will be 5,10,15... minutes past the hour
z %>%
  group_by(d = cut(d, breaks=breaks, labels=(breaks - 60)[-1])) %>%
  summarize(x = mean(x))

                     d           x
1  2012-01-01 00:00:00 -1.14713698
2  2012-01-01 00:05:00 -0.17172950
3  2012-01-01 00:10:00  0.19049591
4  2012-01-01 00:15:00  0.15619679
5  2012-01-01 00:20:00  0.18397502
6  2012-01-01 00:25:00  0.33750870
7  2012-01-01 00:30:00 -0.22182889
8  2012-01-01 00:35:00 -0.01832799
9  2012-01-01 00:40:00  1.08747482
10 2012-01-01 00:45:00  0.36870290
11 2012-01-01 00:50:00  0.75684684
12 2012-01-01 00:55:00  0.14584254
13 2012-01-01 01:00:00  0.34766052

【讨论】:

感谢您的建议。当我尝试您的解决方案时,在时间戳上增加 4 分钟,平均值和打印的时间戳相差整整 5 分钟......但是,当使用 z %&gt;% group_by(d = cut(d, breaks=breaks, labels=(breaks -60)[-1])) %&gt;% summarize(x = mean(x)) 时,这会将平均值与所需的时间戳对齐。但是,我需要创建一个中断序列,我不会为我读入的每个文件重新编写它......如果这有意义的话。 您可能会编写一个函数,根据特定文件中的时间设置中断和标签。但是,很可能一个或多个与时间/日期相关的软件包已经具有可以满足您需要的功能。希望有人能够提出解决方案。 我相信我可以改用这个 breaks=seq(min(z$d)-240,max(z$d)+300,by="5 min") 似乎可以自动完成这项工作。

以上是关于使用 dplyr 包按时间平均 - R的主要内容,如果未能解决你的问题,请参考以下文章

多组 - 加权平均值 - 不在 r 中工作(使用 dplyr)

使用 dplyr 按 R 中的组比较平均值(ANOVA)

使用 R googlemap 包按集群收集标记

使用 dplyr 根据列值对 R 中的值求和

使用 R 中的 Formattable 包按行排列条件

使用 dplyr 和 RcppRoll 计算所有固定窗口平均值