R语言:如何按用户类型获取使用量Top20的站点?
按用户类型提取使用量Top20站点
以下提供两种适配你的需求的实现方法,针对300万+观测值的大数据量都适用:
方法一:使用tidyverse(dplyr包)
这个方法代码可读性强,适合新手理解:
# 先安装并加载dplyr包(首次使用需安装) # install.packages("dplyr") library(dplyr) # 执行分组统计、排序、提取Top20 top20_stations <- trips %>% # 按用户类型和站点分组 group_by(users, stations) %>% # 统计每个组的观测数量(即使用次数) summarise(usage_count = n(), .groups = "drop_last") %>% # 按使用次数降序排列 arrange(desc(usage_count)) %>% # 为每个用户类型提取使用量前20的站点 slice_max(n = 20, order_by = usage_count) # 查看结果 print(top20_stations)
如果需要严格只取前20个(忽略并列排名的站点),可以在slice_max中添加with_ties = FALSE参数。
方法二:使用基础R(无需额外安装包)
如果不想安装第三方包,可以用基础R实现:
# 生成用户-站点的交叉计数表 station_usage <- table(trips$users, trips$stations) # 转换为数据框格式 usage_df <- as.data.frame(station_usage) colnames(usage_df) <- c("users", "stations", "usage_count") # 按用户分组,提取每组前20的站点 top20_stations_base <- do.call(rbind, lapply(split(usage_df, usage_df$users), function(group_df) { # 按使用次数降序排序 sorted_group <- group_df[order(-group_df$usage_count), ] # 取前20行 head(sorted_group, 20) })) # 重置结果的行名 rownames(top20_stations_base) <- NULL # 查看结果 print(top20_stations_base)
针对示例数据的验证
用你提供的示例数据测试,两种方法都会输出类似如下结果:
| users | stations | usage_count |
|---|---|---|
| member | stn1 | 2 |
| member | stn3 | 1 |
| user | stn2 | 2 |
| user | stn1 | 1 |
| user | stn3 | 1 |
(注:示例数据中每个用户类型的站点不足20,所以会返回所有站点)
内容的提问来源于stack exchange,提问作者curious_
相关产品推荐
相关产品推荐

