Transform all the date ranges together as a set to produce a
new set of date ranges. Ranges separated by a gap of at least min.gapwidth
days are not merged.
reduce(df, begin, end, ..., agg_cols = NULL, agg = "sum", min.gapwidth = 5)
data.frame
name of column df
with begin dates
name of column in df
with end dates
names of columns in df
used to group date ranges by
list with columns in df
to aggregate by (defaults to NULL)
aggregation type (defaults to "sum")
ranges separated by a gap of at least min.gapwidth
days are not merged. Defaults to 5.
An object of class "reduce"
.
The function summary
is used to obtain and print a summary of the results.
An object of class "reduce"
is a list usually containing at least the
following elements:
data frame with reduced time periods
name of column in df
with begin dates
name of column in df
with end dates
names of columns in df
used to group date ranges by
This function is adopted from IRanges::reduce()
.
portfolio <- structure(list(policy_nr = c("12345", "12345", "12345", "12345",
"12345", "12345", "12345", "12345", "12345", "12345", "12345"),
productgroup = c("fire", "fire", "fire", "fire", "fire", "fire",
"fire", "fire", "fire", "fire", "fire"), product = c("contents",
"contents", "contents", "contents", "contents", "contents", "contents",
"contents", "contents", "contents", "contents"),
begin_dat = structure(c(16709,16740, 16801, 17410, 17440, 17805, 17897,
17956, 17987, 18017, 18262), class = "Date"),
end_dat = structure(c(16739, 16800, 16831, 17439, 17531, 17896, 17955,
17986, 18016, 18261, 18292), class = "Date"),
premium = c(89L, 58L, 83L, 73L, 69L, 94L, 91L, 97L, 57L, 65L, 55L)),
row.names = c(NA, -11L), class = "data.frame")
# Merge periods
pt1 <- reduce(portfolio, begin = begin_dat, end = end_dat, policy_nr,
productgroup, product, min.gapwidth = 5)
# Aggregate per period
summary(pt1, period = "days", policy_nr, productgroup, product)
#> date type count policy_nr productgroup product
#> 1 2020-02-01 out 1 12345 fire contents
#> 2 2018-10-01 in 1 12345 fire contents
#> 3 2018-01-01 out 1 12345 fire contents
#> 4 2017-09-01 in 1 12345 fire contents
#> 5 2016-02-01 out 1 12345 fire contents
#> 6 2015-10-01 in 1 12345 fire contents
# Merge periods and sum premium per period
pt2 <- reduce(portfolio, begin = begin_dat, end = end_dat, policy_nr,
productgroup, product, agg_cols = list(premium), min.gapwidth = 5)
# Create summary with aggregation per week
summary(pt2, period = "weeks", policy_nr, productgroup, product)
#> week type count policy_nr productgroup product
#> 1 2020W06 out 1 12345 fire contents
#> 2 2018W40 in 1 12345 fire contents
#> 3 2018W02 out 1 12345 fire contents
#> 4 2017W35 in 1 12345 fire contents
#> 5 2016W06 out 1 12345 fire contents
#> 6 2015W40 in 1 12345 fire contents