如何用R确定患者接听电话的最优星期与小时组合时段
找出患者电话最易接听的星期与时段
问题背景
需要确定拨打患者电话时接听量最高的星期+小时时段(如周三13:00-14:00),已完成以下数据处理:
- 将日期转换为星期几(
dow字段) - 将
picked_up的Yes/No转为二进制变量(1表示接听,0表示未接听) - 将时间划分为09:00-18:00的小时分箱
遇到两个问题:
- 手动遍历所有星期+小时组合统计接听量效率太低,尝试
max和which.max未得到预期结果 - 编写的ggplot代码生成的各星期图表几乎完全相同,无法反映不同星期的时段差异
样本数据与预处理代码
样本数据
df <- data.frame(time = c("09:55", "10:10", "10:15", "10:55", "12:35", "13:45", "15:30", "15:45", "17:00", "11:15"), date = c("2023-05-19", "2023-05-12", "2023-05-24", "2023-05-12", "2023-05-24", "2023-05-24", "2023-05-16", "2023-05-14", "2023-05-16", "2023-05-18"), picked_up = c("No", "No", "No", "No", "Yes", "Yes", "No", "No", "Yes", "Yes"))
数据预处理
# 日期转星期几 df$dow <- weekdays(as.Date(df$date)) # 接听状态转二进制 df$binary <- if_else(df$picked_up == "Yes", 1, 0) # 时间转小时分箱(如09:55转为09:00) df$hour <- format(strptime(df$time, "%H:%M"), "%H:00")
解决方案
1. 快速定位接听量最高的星期+时段
无需手动遍历,通过dplyr同时按星期和小时分组求和,再提取最大值即可:
# 按星期+小时分组统计接听总数 freq_day_hour <- df %>% group_by(dow, hour) %>% summarize(total_picked = sum(binary), .groups = "drop") # 提取接听量最高的时段(若有多个并列最大值会全部返回) top_slot <- freq_day_hour %>% slice_max(total_picked, n = 1) print(top_slot)
样本数据运行结果示例:
# A tibble: 4 × 3 dow hour total_picked <chr> <chr> <dbl> 1 Friday 11:00 1 2 Wednesday 12:00 1 3 Wednesday 13:00 1 4 Tuesday 17:00 1
2. 修复ggplot图表重复问题
原代码中连续两次group_by会覆盖之前的分组规则,仅按hour全局统计接听量,导致各星期图表数值完全一致。正确做法是同时按dow和hour分组:
df %>% group_by(dow, hour) %>% mutate(resp = sum(binary)) %>% ungroup() %>% ggplot(aes(x = hour, y = resp)) + geom_point() + ylab("接听次数") + xlab("时段") + facet_wrap(vars(dow))
修改后,每个分面会显示对应星期各时段的实际接听次数,不会再出现重复的图表。
内容的提问来源于stack exchange,提问作者dlodge
相关产品推荐
相关产品推荐

