从日期范围分配总计到正确的月份

时间:2019-03-19 15:33:42

标签: r database accounting

我有一个包含预订数据的数据集,其格式如下:

property   <- c('casa1', 'casa2', 'casa3')
check_in   <- as.Date(c('2018-01-01', '2018-01-30','2018-02-28'))
check_out  <- as.Date(c('2018-01-02', '2018-02-03', '2018-03-02'))
total_paid <- c(100,110,120)

df <- data.frame(property,check_in,check_out, total_paid)

我的目标是将每月total_paid的金额除以天数,并出于预算原因将其正确分配给每月。
尽管casa1没问题,但是casa2casa3在两个月中都有保留天,因此总数总计会因此问题而出现偏差。

任何帮助,不胜感激!

1 个答案:

答案 0 :(得分:0)

您在这里:

library(dplyr)
library(tidyr)
df %>% 
  mutate(id = seq_along(property), # make few variable to help
         day_paid = total_paid / as.numeric(check_out - check_in),
         date = check_in) %>% 
  group_by(id) %>% 
  complete(date = seq.Date(check_in, (check_out - 1), by = "day")) %>% # get date for each day of stay (except last)
  ungroup() %>% # make one row per day of stay
  mutate(month = cut(date, breaks = "month")) %>% # determine month of date
  fill(property, check_in, check_out, total_paid, day_paid) %>% 
  group_by(id, month) %>% 
  summarise(property = unique(property),
            check_in = unique(check_in),
            check_out = unique(check_out),
            total_paid = unique(total_paid),
            paid_month = sum(day_paid)) # summarise per month

结果:

# A tibble: 5 x 7
# Groups:   id [3]
     id month      property check_in   check_out  total_paid paid_month
  <int> <fct>      <fct>    <date>     <date>          <dbl>      <dbl>
1     1 2018-01-01 casa1    2018-01-01 2018-01-02        100        100
2     2 2018-01-01 casa2    2018-01-30 2018-02-03        110         55
3     2 2018-02-01 casa2    2018-01-30 2018-02-03        110         55
4     3 2018-02-01 casa3    2018-02-28 2018-03-02        120         60
5     3 2018-03-01 casa3    2018-02-28 2018-03-02        120         60

我希望它有点可读性,但请问是否有什么我应该解释的。习惯上,人们不支付最后一天的住宿费用,因此我考虑了这一点。