Агрегируйте многомерные почасовые данные с накоплением в дневной максимум, а значит в R с data.table - PullRequest
0 голосов
/ 18 октября 2018

Я искал различные вопросы об агрегации R здесь по стеку (например, Агрегирование почасовых данных в ежедневные агрегаты ), но ни один из них не обращается к многомерной таблице в длинном формате.

Моя таблица является почасовой таблицей наблюдаемыхи смоделированные значения (для всего года) для каждого сайта (до восьми), как показано ниже:

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 голосов
/ 19 октября 2018

Я не уверен, что вы имеете в виду под "таблицей": используете ли вы пакет data.table или просто функцию read.table() базы R. Я дам ответ, который работает для обоих подходов, но неоптимальный , если вы используете 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 предполагается символом, поэтому stringsAsFactors = FALSE следует установить при использовании read.table().

Надеюсь, это поможет:)

...