基于R语言统计酒店任意日期在住人数的实现方法咨询
实现方案
第一步:数据预处理
首先需要将字符类型的日期转换为Date格式,同时处理未退房用户的记录,由于我们统计的是2010年1月的在住人数,将未退房用户的退房日期暂设为2010年1月31日即可:
library(dplyr) # 转换日期格式,处理未退房记录 hotel <- hotel %>% mutate( check_in_date = as.Date(check_in_date), check_out_date = as.Date(ifelse(check_out_date == "still in hotel as of today", "2010-01-31", check_out_date)) ) # 生成1月完整日期序列 day_df <- data.frame(date = seq(as.Date("2010-01-01"), as.Date("2010-01-31"), by = "day"))
第二步:计算每日在住人数(两种方案可选)
方案1:基于你现有逻辑的增量统计法
你之前统计每日入住、退房人次的思路可以通过累加增量实现:
# 统计每日入住人次 check_ins <- hotel %>% group_by(date = check_in_date) %>% summarise(check_in_num = n()) # 统计每日退房人次 check_outs <- hotel %>% group_by(date = check_out_date) %>% summarise(check_out_num = n()) # 合并日期与出入住统计,计算在住人数 daily_stats <- day_df %>% left_join(check_ins, by = "date") %>% left_join(check_outs, by = "date") %>% # 空值替换为0 mutate(across(c(check_in_num, check_out_num), ~ifelse(is.na(.), 0, .))) %>% # 累加每日增量得到当日在住人数 mutate(occupancy = cumsum(check_in_num - check_out_num)) # 提取最终需要的日期、在住人数结果 result <- daily_stats %>% select(date, occupancy)
方案2:逐天匹配法(逻辑更简单,适合小数据量)
直接逐天统计满足「入住日期≤当天且退房日期≥当天」的用户数:
daily_occupancy <- day_df %>% rowwise() %>% mutate( occupancy = sum(hotel$check_in_date <= date & hotel$check_out_date >= date) )
结果示例
输出的result数据框格式如下(仅展示前10条):
| date | occupancy |
|---|---|
| 2010-01-01 | 2 |
| 2010-01-02 | 3 |
| 2010-01-03 | 3 |
| 2010-01-04 | 2 |
| 2010-01-05 | 2 |
| 2010-01-06 | 2 |
| 2010-01-07 | 1 |
| 2010-01-08 | 3 |
| 2010-01-09 | 2 |
| 2010-01-10 | 2 |
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

