You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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表截图:
temp table


解决方法

你的代码问题出在分组逻辑错误:

  1. 先按carrier和dest分组去重,已经得到了每个航空公司对应的所有目的地;
  2. 但后续又按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 01:14:56