如何在R管道中正确使用min_rank()对航空公司按目的地数量排名
问题描述
我正在完成《R for Data Science》一书的习题,但在数据转换环节遇到困难。我想在数据框temp中新增一列,根据每个carrier(航空公司)飞往的dest(目的地)数量对其排名,请问能否通过管道(pipe)实现该需求?
我的代码如下:
library(nycflights13) not_cancelled <- flights %>% filter(!is.na(dep_delay), !is.na(arr_delay)) temp <- not_cancelled %>% group_by(carrier, dest) %>% summarise() %>% mutate(count = n())%>% group_by(carrier, count) %>% summarise()
我尝试在管道中添加min_rank()函数,但未实现排名效果,所有值都被赋值为1,代码如下:
temp <- not_cancelled %>% group_by(carrier, dest) %>% summarise() %>% mutate(count = n())%>% group_by(carrier, count) %>% summarise() %>% mutate(rank = min_rank(desc(count)))
附temp表截图:
解决方法
你的代码问题出在分组逻辑错误:
- 先按
carrier和dest分组去重,已经得到了每个航空公司对应的所有目的地; - 但后续又按
carrier和count分组并执行summarise(),这会导致每个分组里只剩1行数据——min_rank()在单元素组里计算,结果自然全是1。
正确的思路是:先统计每个航空公司的目的地总数,再基于这个总数排名。用管道可以一步完成,不需要中间的错误分组:
library(nycflights13) library(dplyr) not_cancelled <- flights %>% filter(!is.na(dep_delay), !is.na(arr_delay)) # 正确的管道实现 temp <- not_cancelled %>% # 去重每个航空公司的目的地,避免重复统计同一目的地 distinct(carrier, dest) %>% # 按航空公司分组,统计目的地数量 group_by(carrier) %>% summarise(dest_count = n()) %>% # 按目的地数量降序排名(数量越多排名越靠前) mutate(rank = min_rank(desc(dest_count))) %>% # 可选:按排名排序,方便查看结果 arrange(rank)
代码细节说明:
distinct(carrier, dest):直接保留每个carrier对应的唯一dest,比先分组再summarise()更简洁高效;group_by(carrier) %>% summarise(dest_count = n()):精准统计每个航空公司的目的地总数;mutate(rank = min_rank(desc(dest_count))):基于dest_count降序计算排名,desc()表示从多到少排序,min_rank()会自动处理并列情况(比如两个航空公司目的地数量相同,排名一致)。
运行后就能得到每个航空公司的目的地数量,以及对应的正确排名,不会再出现全为1的情况。
内容的提问来源于stack exchange,提问作者Linda PJ
相关产品推荐
相关产品推荐

