Присвоение итогов правильному месяцу из диапазона дат - PullRequest
1 голос
/ 19 марта 2019

У меня есть набор данных с данными бронирования, который имеет следующий формат:

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 нет проблем, у casa2 и casa3 зарезервированы дни в обоих месяцах, и из-за этой проблемы итоги искажаются.

Любая помощь высоко ценится!

1 Ответ

0 голосов
/ 19 марта 2019

Вот, пожалуйста:

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

Я надеюсь, что это несколько читабельно, но, пожалуйста, спросите, есть ли что-то, что я должен объяснить.Считается, что люди не платят последний день пребывания, поэтому я учел это.

...