【问题标题】:Aggregate stacked multivariate hourly data into daily maximum, and means in R with data.table将堆叠的多元每小时数据聚合为每日最大值,并在 R 中使用 data.table 表示
【发布时间】:2019-03-23 08:58:18
【问题描述】:

我在 stackoverflow 上搜索了各种 R 聚合问题(例如 Aggregating hourly data into daily aggregates),但没有一个解决长格式的多元表。

我的表格是每个站点(最多 8 个)的观测值和建模值(全年)的每小时表,如下所示:

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") 进行每日平均,但没有得到我想要的结果。任何帮助将不胜感激。

【问题讨论】:

  • 如果您阅读本文,它将帮助您更好地格式化您的问题,并产生更快/更准确的解决方案。 stackoverflow.com/questions/5963269/…
  • 在输入问题时尝试对其进行格式化,但不能
  • 感谢 Alon 的编辑

标签: r data.table max aggregate


【解决方案1】:

我不确定“表”是什么意思:您是使用 data.table 包还是仅使用基本 R 的 read.table() 函数。我将给出一个适用于这两种方法的答案,但suboptimal 如果您使用的是data.table

解决您的问题最方便的方法是使用 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 列的类型应该是一个字符,所以在使用read.table() 时应该设置stringsAsFactors = FALSE

希望,它会有所帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2020-07-15
    • 2016-02-02
    • 1970-01-01
    • 2021-08-17
    • 2016-09-27
    • 1970-01-01
    相关资源
    最近更新 更多