Как получить среднечасовое значение во фрейме данных временного ряда с несколькими столбцами

#r #dplyr #time-series

#r #dplyr #временные ряды

Вопрос:

У меня есть данные временного ряда с 3 столбцами с датами, значениями энергии и названиями станций. Я хочу получить среднее значение энергии за час отдельно для каждой станции.

Мои данные выглядят следующим образом

дф

      Datetime          Energy  Station
1 2016-01-01 07:19:00 743.0253   Ajmer
2 2016-01-01 07:20:00 765.7225   Ajmer
3 2016-01-01 07:21:00 788.1493   Ajmer
4 2016-01-01 08:20:00 834.7815   Ajmer
5 2016-01-01 08:21:00 857.3012   Ajmer
6 2016-01-31 16:58:00 3427.098  Kotada
7 2016-01-31 16:59:00 3397.591  Kotada
8 2016-01-31 17:00:00 3344.149  Kotada
9 2016-01-31 17:01:00 3270.803  Kotada
  

Ожидаемый Результат:

      Datetime          Energy    Station
1. 2016-01-01 07:00:00 765.6324   Ajmer
2. 2016-01-01 08:00:00 846.0413   Ajmer
3. 2016-01-01 16:00:00 3412.345   Kotada
4. 2016-01-01 17:00:00 3307.476   Kotada
  

Я попробовал функцию group_by для формирования сгруппированного фрейма данных по названиям станций, а затем использовал агрегатную функцию для получения среднечасового значения. Но это не работает.

 > byStn=df %>% group_by(Station)
> hour_byStn=byStn %>% 
             aggregate(energy,                                      
                        list(hourtime = cut(Datetime, breaks="hour")),  
                        mean, na.rm = TRUE)
  

Я получил следующую ошибку :
Ошибка в cut(Datetime, breaks = «час»): объект ‘Datetime’ не найден.

Не могли бы вы рассказать мне, как это сделать. Это первый раз, когда я работаю с данными временных рядов, а также с пакетом dpylr.

Ответ №1:

Мы можем использовать floor_date от lubridate до floor ‘DateTime’ по hour ly интервалу, использовать это в group_by наряду с ‘Station’ и получить mean значение ‘Energy’

 library(lubridate)
library(tidyverse)
df %>%
    group_by(Datetime = floor_date(Datetime, "hour"), Station) %>%
    summarise(Energy = mean(Energy, na.rm = TRUE))
# A tibble: 4 x 3
# Groups:   Datetime [4]
#  Datetime            Station Energy
#  <dttm>              <chr>    <dbl>
#1 2016-01-01 07:00:00 Ajmer     766.
#2 2016-01-01 08:00:00 Ajmer     846.
#3 2016-01-31 16:00:00 Kotada   3412.
#4 2016-01-31 17:00:00 Kotada   3307.
  

данные

 df <- structure(list(Datetime = structure(c(1451650740, 1451650800, 
1451650860, 1451654400, 1451654460, 1454277480, 1454277540, 1454277600, 
1454277660), class = c("POSIXct", "POSIXt"), tzone = ""), Energy = c(743.0253, 
765.7225, 788.1493, 834.7815, 857.3012, 3427.098, 3397.591, 3344.149, 
3270.803), Station = c("Ajmer", "Ajmer", "Ajmer", "Ajmer", "Ajmer", 
"Kotada", "Kotada", "Kotada", "Kotada")), row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9"), class = "data.frame")
  

Ответ №2:

Я не тестировал это, но вы хотите что-то вроде этого…

 df %>%
    mutate(hourtime = cut(Datetime, breaks='hour')) %>%
    group_by(Station, hourtime) %>%
    summarise(avg_energy = mean(Energy, na.rm = T))
  

Я бы предложил, возможно, ознакомиться с некоторым базовым dplyr синтаксисом. Я ссылался на это неукоснительно, когда впервые начал его использовать:https://cran.r-project.org/web/packages/dplyr/vignettes/dplyr.html