在 R 中跨天的特定时间平均数据
Averaging data at specific hours across days in R
- Update(2021/5/13, 11:55AM): 数据不可重现。谢谢@G。 Grothendieck 给我评论。
(这是我在 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
- Update(2021/5/13, 11:55AM): 数据不可重现。谢谢@G。 Grothendieck 给我评论。
(这是我在 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