R中几个月内按天数分组数据

Group data by group of days within months in R

我正在尝试按每个月的 10 天时间段来汇总这个每日时间序列的降雨量,并计算累积降雨量。

library(tidyverse)
(dat <- tibble(
  date = seq(as.Date("2016-01-01"), as.Date("2016-12-31"), by=1),
  rainfall = rgamma(length(date), shape=2, scale=2)))

因此,我会得到第三组在一年中的变化,比如:1月第三组有11天,2月有9天,以此类推。这是我的尝试:

library(lubridate)
dat %>% 
  group_by(decade=floor_date(date, "10 days")) %>%
  summarize(acum_rainfall=sum(rainfall), 
            days = n())

这是结果输出

# A tibble: 43 x 3
   decade     acum_rainfall  days
   <date>             <dbl> <int>
 1 2016-01-01         48.5     10
 2 2016-01-11         39.9     10
 3 2016-01-21         36.1     10
 4 2016-01-31          1.87     1
 5 2016-02-01         50.6     10
 6 2016-02-11         32.1     10
 7 2016-02-21         22.1      9
 8 2016-03-01         45.9     10
 9 2016-03-11         30.0     10
10 2016-03-21         42.4     10
# ... with 33 more rows

谁能帮我把残差周期加到第三个周期,每个月总是有 3 个周期?这将是所需的输出(注意第 3 行):

   decade     acum_rainfall  days
   <date>             <dbl> <int>
 1 2016-01-01         48.5     10
 2 2016-01-11         39.9     10
 3 2016-01-21         37.97    11
 4 2016-02-01         50.6     10
 5 2016-02-11         32.1     10
 6 2016-02-21         22.1      9

一种方法是使用 if_else 根据 date 的日期值以不同参数应用 floor_date。如果 day(date) 小于 30,则使用正常方式;如果大于等于 30,则使用 '20 days' 以确保它四舍五入到第 21 天:

dat %>% 
    group_by(decade=if_else(day(date) >= 30,
                            floor_date(date, "20 days"),
                            floor_date(date, "10 days"))) %>%
    summarize(acum_rainfall=sum(rainfall), 
              days = n())

# A tibble: 36 x 3
   decade     acum_rainfall  days
   <date>             <dbl> <int>
 1 2016-01-01          38.8    10
 2 2016-01-11          38.4    10
 3 2016-01-21          43.4    11
 4 2016-02-01          34.4    10
 5 2016-02-11          34.8    10
 6 2016-02-21          25.3     9
 7 2016-03-01          39.6    10
 8 2016-03-11          53.9    10
 9 2016-03-21          38.1    11
10 2016-04-01          36.6    10
# … with 26 more rows