如何按月份和用户类型分组,获取Top10站点用户数并降序排序
解决方案
你可以通过dplyr的分组和切片函数直接实现需求,无需拆分数据集。核心是在month_of_day和member_casual的组合分组内,对站点用户数排序并提取Top10,同时确保月份按1-12月顺序展示。
完整代码示例
library(dplyr) # 1. 确保月份为有序因子(保证1-12月的展示顺序) annual_2022_v2 <- annual_2022_v2 %>% mutate(month_of_day = factor(month_of_day, levels = 1:12, labels = c("1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"), ordered = TRUE)) # 2. 分组统计+提取各组合下的Top10站点 top10_stations <- annual_2022_v2 %>% # 按月份、用户类型、站点分组,统计用户数 group_by(month_of_day, member_casual, start_station_name) %>% summarize(users = n(), .groups = "drop_last") %>% # drop_last保留前两级分组(月份+用户类型) # 在每个月份+用户类型的组内,取用户数最多的前10个站点 slice_max(users, n = 10, with_ties = FALSE) %>% # with_ties=FALSE避免并列时超出10个 # 可选:添加组内排名列 mutate(rank = row_number(desc(users))) %>% # 按月份、用户类型、排名排序输出 arrange(month_of_day, member_casual, rank)
关键步骤说明
- 处理月份顺序:将
month_of_day转为有序因子,避免默认的字符/数字排序混乱,确保输出按1月到12月依次展示。 - 分组统计:先按
month_of_day、member_casual、start_station_name三级分组统计用户数,.groups = "drop_last"保留前两级分组,方便后续在组内取Top10。 - 提取Top10:
slice_max(users, n=10)会在每个month_of_day + member_casual的组内,筛选用户数最高的10个站点;with_ties=FALSE可以避免因并列数值导致结果超过10条(如果需要保留并列,可设为TRUE)。 - 添加排名:
mutate(rank = row_number(desc(users)))会在每个组内生成1-10的排名,便于查看站点的位次。
输出效果
最终的top10_stations数据框会按1月到12月的顺序,分别展示Casual和Member两类用户下,各月份用户数排名前10的站点、用户数及组内排名。
内容的提问来源于stack exchange,提问作者Albert Wang
相关产品推荐
相关产品推荐

