在 R 中跨天的特定时间平均数据

Averaging data at specific hours across days in R

(这是我在 Whosebug 中的第一个 post,如果我在这个问题上犯了任何基本错误,请告诉我)

嗨,

我在R中有一个多天的每小时测量的空气质量数据,我想计算特定时间段的平均空气质量。

这是我的可重现数据的一个子集。它是xts格式。

# Make a structure of data
dput(Air_sample[1:6,1:1])

# Create a data from the structure above.
Air <- structure(
 c(2.6, 2, 2.2, 2.2, 1.6, 1.2),
 class = c("xts", "zoo"),
 index = structure(
  c(
   1078959600,
   1078963200,
   1079046000,
   1079049600,
   1079132400,
   1079136000
  ),
  tzone = "",
  tclass = c("POSIXct",
             "POSIXt")
 ),
 .Dim = c(6L, 1L),
 .Dimnames = list(NULL, c("True.CO")))

> Air
                    True.CO
2004-03-10 18:00:00     2.6
2004-03-10 19:00:00     2.0
2004-03-11 18:00:00     2.2
2004-03-11 19:00:00     2.2
2004-03-12 18:00:00     1.6
2004-03-12 19:00:00     1.2

我想计算多天特定时间(例如下午 6 点)的平均 CO。 所以结果会像下面这样。

Air_average <- data.frame("Time" = c("18:00","19:00"), "Average CO" = c(2.1333,1.8))

> Air_average
   Time Average.CO
1 18:00     2.1333
2 19:00     1.8000

我通过谷歌搜索尝试了不同的功能,例如“period.apply”、“子集”、“window”等。但其中 none 似乎有效。

有什么办法吗?

谢谢。

你可以用dplyr之类的东西来做分组操作,用lubridate之类的东西来处理日期。 lubridate 具有 hour 功能,其中 return 只有小时。 我先把你的数据转换成数据框:

library(lubridate)
library(dplyr)
library(xts)

Air <- data.frame(Air) %>% 
  add_rownames(var = "time")

  time                True.CO
  <chr>                 <dbl>
1 2004-03-11 00:00:00     2.6
2 2004-03-11 01:00:00     2  
3 2004-03-12 00:00:00     2.2
4 2004-03-12 01:00:00     2.2
5 2004-03-13 00:00:00     1.6
6 2004-03-13 01:00:00     1.2

因为我的时区,时间和你的不一样,但是代码是一样的。

Air %>%
  group_by(hour(time))%>%
  summarise(mean(True.CO))

# A tibble: 2 x 2
  `hour(time)` `mean(True.CO)`
         <int>           <dbl>
1            0            2.13
2            1            1.8