Скользящее наименьшее среднее и стандартное число n последовательных минут каждого периода времени - PullRequest
3 голосов
/ 16 марта 2019

Новый пользователь R здесь ищет руководство.Я работаю с 15-минутным набором данных и собираюсь проанализировать следующее по одной переменной (здания в моем случае) для каждого дня года: (1) наименьшее среднее значение «значения» для n последовательных строк (предпочтительно 2 или3 часа) (2) стандартное отклонение того же периода

Пример df:

    variable    year month day hr min   date     value
    building_a  2018    6   2   0   0   6/2/2018    19
    building_a  2018    6   2   0   15  6/2/2018    19
    building_a  2018    6   2   0   30  6/2/2018    19
    building_a  2018    6   2   0   45  6/2/2018    17
    building_a  2018    6   2   1   0   6/2/2018    17
    building_a  2018    6   2   1   15  6/2/2018    15
    building_a  2018    6   2   1   30  6/2/2018    15
    building_a  2018    6   2   1   45  6/2/2018    14
    building_a  2018    6   2   2   0   6/2/2018    14
    building_a  2018    6   2   2   15  6/2/2018    13
    building_a  2018    6   2   2   30  6/2/2018    13
    building_a  2018    6   2   2   45  6/2/2018    13
    building_a  2018    6   2   3   0   6/2/2018    12
    building_a  2018    6   2   3   15  6/2/2018    14
    building_a  2018    6   2   3   30  6/2/2018    13
    building_a  2018    6   2   3   45  6/2/2018    13
    building_b  2018    6   2   0   0   6/2/2018    37
    building_b  2018    6   2   0   15  6/2/2018    41
    building_b  2018    6   2   0   30  6/2/2018    38
    building_b  2018    6   2   0   45  6/2/2018    39
    building_b  2018    6   2   1   0   6/2/2018    37
    building_b  2018    6   2   1   15  6/2/2018    36
    building_b  2018    6   2   1   30  6/2/2018    34
    building_b  2018    6   2   1   45  6/2/2018    34
    building_b  2018    6   2   2   0   6/2/2018    35
    building_b  2018    6   2   2   15  6/2/2018    35
    building_b  2018    6   2   2   30  6/2/2018    29
    building_b  2018    6   2   2   45  6/2/2018    32
    building_b  2018    6   2   3   0   6/2/2018    30
    building_b  2018    6   2   3   15  6/2/2018    33
    building_b  2018    6   2   3   30  6/2/2018    30
    building_b  2018    6   2   3   45  6/2/2018    32

Я смог выполнить это для сегментов продолжительностью в один час, используя следующий подход, ноне могу понять, как адаптировать это к большему окну (например, самое низкое среднее значение 135 минут вместо 60 минут).

    tmp <- aggregate(value~variable+date+hour, df, 
                               function(x) 
                                   c(mean = mean(x), sd = sd(x)))

    tmp2 <- do.call("data.frame",tmp)
    tmp2$value.mean <- as.numeric(tmp2$value.mean)
    tmp2$value.sd <- as.numeric(tmp2$value.sd)

    tmp2_flat <- tmp2 %>%
      group_by(variable, date) %>%
      filter(value.mean == min(value.mean)) %>%
      arrange(variable, date, value.sd) %>%
      slice(1)

Заранее благодарю за любые советы

1 Ответ

0 голосов
/ 17 марта 2019

Я немного поиграл, и вот что я придумал:

ОБНОВЛЕНИЕ: Последний ответ не был практически осуществимым.Отзывов не было, но я все же меняю их.

library(zoo)
library(dplyr)

df %>%
  group_by(variable, date) %>%
  mutate(minimum =  rollapply(value, width = 4, FUN = mean, fill = NA, align = "right"),
         sd = rollapply(value, width = 4, FUN = sd, fill = NA, align = "right")) %>%
  slice(which.min(minimum))

# A tibble: 2 x 10
# Groups:   variable, date [2]
  variable    year month   day    hr   min date     value minimum    sd
  <fct>      <int> <int> <int> <int> <int> <fct>    <int>   <dbl> <dbl>
1 building_a  2018     6     2     3     0 6/2/2018    12    12.8  0.5 
2 building_b  2018     6     2     2    30 6/2/2018    29    33.2  2.87

Однако идея остается прежней.В функции rollapply() можно указать n последовательных строк с помощью аргумента width=.4 означает в этом случае 4 * 15 minutes = 1 hour, но может быть любое количество четверти часа.И он вычисляет «скользящее среднее» value в каждой строке, оглядываясь назад width строк.

Это должно быть сделано, я надеюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...