如何将R语言预订数据集中的总金额按日期范围分配至对应月份?
解决跨月预订金额拆分的R方案
没问题,我帮你搞定这个预算核算的难题!针对你这份跨月的预订数据,我们可以通过拆分每日记录再按月份聚合的方式,精准把total_paid分配到对应的月份里。下面是具体的实现步骤和代码:
步骤1:准备数据并计算基础指标
首先先把你提供的数据加载好,再计算每个预订的入住天数和单日单价:
# 加载你提供的数据集 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) # 计算实际入住天数(退房日不算入住,所以用check_out - check_in) df$stay_days <- as.integer(df$check_out - df$check_in) # 计算单日单价 df$daily_rate <- df$total_paid / df$stay_days
步骤2:拆分预订为每日记录
我们用tidyverse工具链把每个预订拆成对应天数的每日记录,同时生成每天的入住日期:
library(tidyverse) # 拆分出每日记录,并生成完整的入住日期序列 daily_bookings <- df %>% rowwise() %>% # 生成从check_in到check_out前一天的日期序列 mutate(stay_date = list(seq(check_in, check_out - 1, by = "day"))) %>% unnest(stay_date) %>% ungroup()
这里用check_out - 1是因为退房当天通常不算入住天数,比如casa2的退房日是2018-02-03,实际入住到2018-02-02,刚好是4天(1月30、31日,2月1、2日)。
步骤3:按房源和月份聚合金额
最后提取每个日期的年份+月份,分组计算每个房源每个月的分配金额:
monthly_allocation <- daily_bookings %>% # 把日期格式化为"年-月"的形式 mutate(year_month = format(stay_date, "%Y-%m")) %>% group_by(property, year_month) %>% # 计算每个月的总分配金额 summarise(total_allocated = sum(daily_rate), .groups = "drop") %>% # 预算核算一般需要整数,这里做四舍五入处理 mutate(total_allocated = round(total_allocated))
查看最终结果
运行完上面的代码后,monthly_allocation就是你要的按月份拆分的结果:
print(monthly_allocation) # 输出结果: # # A tibble: 5 × 3 # property year_month total_allocated # <chr> <chr> <dbl> # 1 casa1 2018-01 100 # 2 casa2 2018-01 55 # 3 casa2 2018-02 55 # 4 casa3 2018-02 60 # 5 casa3 2018-03 60
你看,casa2的110元按入住天数平分成了1月55元、2月55元;casa3的120元分成了2月60元、3月60元,完全符合预算核算的精准分配要求。如果你的数据量很大,这个方法也能高效处理,因为都是向量化操作~
内容的提问来源于stack exchange,提问作者praguetastic
相关产品推荐
相关产品推荐

