Группировать данные по группам дней в месяцах в R - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь суммировать эту дневную серию осадков по группам по 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)))

Следовательно, я получу изменчивость в третьей группе в течение года, например: в январе у третьего периода будет 11 дней, в феврале 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

1 Ответ

2 голосов
/ 03 мая 2019

Один из способов сделать это - использовать if_else для применения floor_date с разными аргументами в зависимости от значения дня 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
...