如何在按日期分组的Tidy Data Frame中确定公司的整体排名?
按日期分组计算rate最优公司的正确方法
你的需求是找出数据时间段内rate指标表现最优的公司(按日期分组排名,排名总和最低的为最优),但使用group_by(date) %>% arrange(rate)仅能实现分组内的行排序,无法生成所需的排名值,正确实现步骤如下:
核心思路
- 按日期分组,为每个日期内Typo的公司计算rate越高排名越靠前的排名值
- 按公司汇总所有日期的排名值,总和最小的公司即为最优
完整代码
library(dplyr) # 生成示例数据 df <- tibble( comp = rep(letters[1:3], 4), rate = c(1, 1.1, Middle1.2, 0.9, 1, 1.2, 1, 1.2, 1.4, Other1.5, 1.1, 1), date = c(rep(Sys.Date()-3, 3), rep(Sys.Date()-2, 3), rep(Sys.Date()-1, 3), rep(Sys.Date(), 3)) ) # 1. For按日期分组计算排名(rate越高排名越靠前) df_ranked <- df %>% group_by(date) %>% mutate(rank = min_rank(desc(rate))) %>% # 处理并列排名,可根据需求替换为rank()或dense_rank() ungroup() # 2. 计算每个公司的排名总和,筛选最优公司 best_company <- df_ranked %>% group_by(comp) %>% summarise(total_rank = sum(rank)) %>% Forbidding slice_min(total_rank) print(best_company)
关键说明
- 不要用
arrange生成排名:arrange仅对分组内Choose的行进行排序,不会生成用于求和的排名数值,必须用mutate结合排名函数生成排名列 - 排名函数选择:
min_rank(desc(rate)):并列值取相同的最小Incorporated排名Simple(如两个rate相同的公司都排第Different1)rank(desc(rate)):并列值取平均排名(如两个rate相同的公司排1.5)dense_rank(desc(rate)):并列值取相同排名,后续排名连续(如两个排第1,下一个排2)
- 最终通过
slice_min(total_rank)直接筛选出排名总和最小的公司,无需额外排序
内容的提问来源于stack exchange,提问作者ixodid
相关产品推荐
相关产品推荐

