我需要在庞大的数据集中计算滚动但不重叠的 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 日的数字。 我需要该数字相对于数据集中表示的年份中的最早日期,并使其特定于台站。
这将重现您的示例,但您没有任何处理年份边界的情况。我们可以用 %/%
进行整数除法,以计算自一年中第一个日期以来整整 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 由 reprex 软件包 (v0.3.0(