在R中对某个小时和月份的数据帧中的值求平均值

时间:2014-11-02 14:45:17

标签: r

我一直在网上搜索,但没有找到解决这个非常简单的问题的方法。

这是使用库'xts',

的半小时数据
library(xts)
data.xts <- as.xts(1:nrow(data), as.POSIXct("2007-08-24 17:30:00") +
                  1800 * (1:nrow(data)))
data.xts <-as.data.frame(data.xts)

我将其更改为data.frame,因为原始数据是data.frame格式。实际上,在原始数据框中,有一个time_stamp列,如果我可以只使用time_stamp列而不是使用'xts'格式,我更喜欢。

我如何平均每月的每小时数据,以便我可以绘制不同月份的24小时的每小时时间序列?

例如,

 2007-08-24 17:30:00  1
 2007-08-25 17:00:00  47
 2007-08-25 17:30:00  48
 2007-08-26 17:00:00  95

将平均为2007年8月等等。

目标是绘制每月平均24小时的时间序列。

谢谢!

2 个答案:

答案 0 :(得分:1)

尝试

library(dplyr)
res <- dat %>% 
           group_by(month=format(datetime, '%m'),
              #year=format(datetime, '%Y'), #if you need year also
              # as grouping variable
              hour=format(as.POSIXct(cut(datetime, breaks='hour')), '%H')) %>%
           summarise(Meanval=mean(val, na.rm=TRUE))   


 head(res,3)
 #  month hour     Meanval
 #1    01   00 -0.02780036
 #2    01   01 -0.06589948
 #3    01   02 -0.02166218

更新

如果您的datetimePOSIXlt,则可以将其转换为POSIXct

  dat$datetime <- as.POSIXlt(dat$datetime)

通过运行上面的代码,我收到了错误

   # Error: column 'datetime' has unsupported type

您可以使用mutate并将datetime转换为POSIXctas.POSIXct

  res1 <-  dat %>% 
               mutate(datetime= as.POSIXct(datetime)) %>%
               group_by(month=format(datetime, '%m'),
                 #year=format(datetime, '%Y'), #if you need year also
                 # as grouping variable
                  hour=format(as.POSIXct(cut(datetime, breaks='hour')), '%H')) %>%
               summarise(Meanval=mean(val, na.rm=TRUE))  

数据

set.seed(24)
dat <- data.frame(datetime=seq(Sys.time(), by='1 hour', length.out=2000),
    val=rnorm(2000))

答案 1 :(得分:1)

如果我理解正确,您希望平均给定小时的所有值,对于给定月份中的所有日期,并对所有月份执行此操作。因此,对于给定月份的所有日期等,在午夜和00:59:59之间平均所有值。

我发现您要避免xts,但aggregate.zoo(...)就是为此设计的,并且避免使用dplyrcut

library(xts)
# creates sample dataset...
set.seed(1)
data <- rnorm(1000)
data.xts <- as.xts(data, as.POSIXct("2007-08-24 17:30:00") +
                     1800 * (1:length(data)))

# using aggregate.zoo(...)
as.hourly <- function(x) format(x,"%Y-%m %H")
result    <- aggregate(data.xts,by=as.hourly,mean)
result    <- data.frame(result)
head(result)
#                result
# 2007-08 00 0.12236024
# 2007-08 01 0.41593567
# 2007-08 02 0.22670817
# 2007-08 03 0.23402842
# 2007-08 04 0.22175078
# 2007-08 05 0.05081899