我在这里搜索了关于stackoverflow的各种R聚合问题(例如Aggregating hourly data into daily aggregates),但是没有一个以长格式解决多元表。
我的表是每个站点(最多八个)的观测值和建模值(全年)的小时表,如下所示:
date obs mod site
2017-01-01 00:00:00 1.2 -0.7 Carib
2017-01-01 01:00:00 3.1 -0.9 Carib
2017-01-01 02:00:00 2.1 -0.3 Carib
..
..
2017-02-17 10:00:00 2 1.5 Halley
2017-02-17 11:00:00 2.7 1.8 Halley
2017-02-17 12:00:00 3 2.2 Halley
..
..
2017-03-13 13:00:00 5.6 5.6 Yules
2017-03-13 14:00:00 6.5 5.0 Yules
2017-03-13 15:00:00 7.5 4.6 Yules
以下是我想要的结果(不包括丢失的数据)
date max_obs max_mod mean_obs mean_mod site
2017-01-01 -0.7 3.1 -0.9 0.9 Carib
2017-01-02 0.2 -1.5 -0.3 0.5 Carib
..
..
2017-02-17 2.2 1.5 1.1 0.8 Halley
2017-02-18 1.6 1.9 1.2 0.9 Halley
..
..
2017-03-13 5.6 5.2 4.7 5.0 Yules
2017-03-14 5.0 5.2 4.9 5.2 Yules
..
我将数据导入为表格,并尝试使用date <- as.Date(DT$date,"%Y-%m-%d")
进行每日平均,但没有得到我想要的。任何帮助将不胜感激。
答案 0 :(得分:0)
我不确定“表”是什么意思:无论您使用的是data.table
包还是仅使用基础R的read.table()
函数。我将给出一个适用于两种方法都可以,但是如果您使用的是data.table
,则为suboptimal。
解决问题的最方便方法是使用tidyverse
系列的软件包:dplyr
用于数据操作,lubridate
用于日期转换,像这样
library(dplyr)
library(lubridate)
res_df <- obs_df %>%
mutate(calend_day = as_date(date)) %>%
group_by(calend_day, site) %>%
summarize(
max_obs = max(obs),
max_mod = max(mod),
mean_obs = mean(obs),
mean_mod = mean(mod)
) %>%
# set a desired order of columns
select(calend_day, max_obs, max_mod, mean_obs, mean_mod, site)
date
列的类型应由字符组成,因此在使用stringsAsFactors = FALSE
时应设置read.table()
。
希望,它会有所帮助:)