#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