在R中实现按星期几统计骑行记录占比的方法问询
问题描述
正在完成Coursera上的共享单车案例研究,使用R语言处理某共享单车公司的骑行日志数据框,希望生成按星期几划分的会员(member)与临时用户(casual)骑行记录占比的数据框或柱状图。目前尝试分组计数但不知如何计算整体占比,现有代码如下:
weekday_by_member <- p12m %>% filter(member_casual=="member") %>% count(weekday) sorted_weekday_by_member <- arrange(weekday_by_member,levels = c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday","Saturday")) sorted_weekday_by_member weekday_by_casual <- p12m %>% filter(member_casual=="casual") %>% count(weekday) sorted_weekday_by_casual <- arrange(weekday_by_casual,levels = c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday","Saturday")) sorted_weekday_by_casual weekday_mem_cas <- p12m %>% group_by (member_casual) %>% count(weekday) weekday_mem_cas
最简实现方法
1. 生成占比数据框
用dplyr一步完成分组计数、占比计算与排序,避免冗余代码:
library(dplyr) # 按星期内占比计算(每天中会员/临时用户的占比) weekday_ratio <- p12m %>% # 按星期+用户类型分组计数 group_by(weekday, member_casual) %>% summarise(count = n(), .groups = "drop") %>% # 按星期分组,计算每组内的占比(百分比) group_by(weekday) %>% mutate(ratio = round(count / sum(count) * 100, 2)) %>% # 指定星期顺序,避免默认字符排序 mutate(weekday = factor(weekday, levels = c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))) %>% arrange(weekday) weekday_ratio
输出的数据框将包含weekday(星期几)、member_casual(用户类型)、count(骑行记录数)、ratio(占比%)四个字段。
如果需要计算整体所有记录中的占比(即每周几的某类用户占总骑行量的比例),只需去掉计算占比时的group_by(weekday):
overall_ratio <- p12m %>% group_by(weekday, member_casual) %>% summarise(count = n(), .groups = "drop") %>% mutate(ratio = round(count / sum(count) * 100, 2)) %>% mutate(weekday = factor(weekday, levels = c("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))) %>% arrange(weekday)
2. 生成占比柱状图
用ggplot2快速绘制可视化图表:
library(ggplot2) # 堆叠柱状图:展示每天内两类用户的占比结构 ggplot(weekday_ratio, aes(x = weekday, y = ratio, fill = member_casual)) + geom_col() + labs(title = "按星期划分的会员/临时用户骑行占比", x = "星期几", y = "占比(%)", fill = "用户类型") + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 分组柱状图:对比每天两类用户的占比 ggplot(weekday_ratio, aes(x = weekday, y = ratio, fill = member_casual)) + geom_col(position = "dodge") + labs(title = "按星期划分的会员/临时用户骑行占比", x = "星期几", y = "占比(%)", fill = "用户类型") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
内容的提问来源于stack exchange,提问作者FredPurnell
相关产品推荐
相关产品推荐

