В R присваивание числа дате, где число соответствует n-му скользящему непересекающемуся периоду в году, в который эта дата включена - PullRequest
1 голос
/ 28 мая 2019

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

STATION  DATE         VALUE
A   1/15/2010   4
A   1/18/2010   5
A   1/25/2011   2
A   1/30/2011   1
A   2/2/2011    14
B   5/6/2012    6
B   5/14/2012   4
B   5/17/2012   3
B   1/29/2013   16

Я хочу, чтобы это выглядело так:

STATION DATE         VALUE  7DAYPERIOD  YEAR-7DAYPERIOD
A   1/15/2010   4   1   2010-1
A   1/18/2010   5   1   2010-1
A   1/25/2011   2   1   2011-1
A   1/30/2011   1   1   2011-1
A   2/2/2011    14  2   2011-2
B   5/6/2012    6   1   2012-1
B   5/14/2012   4   2   2012-2
B   5/17/2012   3   2   2012-2
B   1/29/2013   16  1   2013-1

, где "7DAYPERIOD" соответствует n-му непересекающемуся 7-дневному периоду относительно самой ранней даты в году для станции. Затем я собирался объединить год с этим номером («YEAR-7DAYPERIOD») и затем агрегировать по этому идентификатору и станции, чтобы вычислить средние значения для каждой станции.

Первоначально я думал, что смазанная "неделя" поможет мне с этим. Но «неделя» дает число относительно 1 января. Мне нужно, чтобы число было относительно самой ранней даты в году, представленной в наборе данных И чтобы оно было конкретным для станции.

1 Ответ

1 голос
/ 28 мая 2019

Это воспроизводит ваш пример, но у вас нет каких-либо дел, касающихся границ года. Мы можем сделать целочисленное деление с помощью %/%, чтобы посчитать количество целых 7-дневных периодов с первой даты в году. Неявно, поскольку мы group_by и STATION и YEAR, это сократит любой 7-дневный период, который пересекает конец года (что может иметь последствия, если вы агрегируете эти значения).

library(tidyverse)

library(lubridate)
tbl <- read_table2(
"STATION  DATE         VALUE
A   1/15/2010   4
A   1/18/2010   5
A   1/25/2011   2
A   1/30/2011   1
A   2/2/2011    14
B   5/6/2012    6
B   5/14/2012   4
B   5/17/2012   3
B   1/29/2013   16"
)
tbl %>%
  mutate(
    DATE = mdy(DATE),
    YEAR = year(DATE)
  ) %>%
  group_by(STATION, YEAR) %>%
  mutate(
    `7DAYPERIOD` = as.integer(DATE - first(DATE)) %/% 7 + 1,
    `YEAR-7DAYPERIOD` = str_c(YEAR, "-", `7DAYPERIOD`)
  )
#> # A tibble: 9 x 6
#> # Groups:   STATION, YEAR [4]
#>   STATION DATE       VALUE  YEAR `7DAYPERIOD` `YEAR-7DAYPERIOD`
#>   <chr>   <date>     <dbl> <dbl>        <dbl> <chr>            
#> 1 A       2010-01-15     4  2010            1 2010-1           
#> 2 A       2010-01-18     5  2010            1 2010-1           
#> 3 A       2011-01-25     2  2011            1 2011-1           
#> 4 A       2011-01-30     1  2011            1 2011-1           
#> 5 A       2011-02-02    14  2011            2 2011-2           
#> 6 B       2012-05-06     6  2012            1 2012-1           
#> 7 B       2012-05-14     4  2012            2 2012-2           
#> 8 B       2012-05-17     3  2012            2 2012-2           
#> 9 B       2013-01-29    16  2013            1 2013-1

Создано в 2019-05-28 пакетом Представления (v0.3.0)

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