将每小时堆叠的多元小时数据汇总为每日最大值,并在R中将data.table表示为平均值

时间:2018-10-18 14:07:40

标签: r data.table max aggregate

我在这里搜索了关于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")进行每日平均,但没有得到我想要的。任何帮助将不胜感激。

1 个答案:

答案 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()

希望,它会有所帮助:)