基于nycflights13数据,如何用group_by分组carrier后筛选US分组满足>1条件
按Carrier分组后筛选特定分组的解决方案
嘿,看起来你已经搞定了数据加载和分组的基础操作!接下来要实现的是在按carrier分组后,筛选出carrier为US且满足某个分组级条件(比如该组记录数>1)的分组,我分两种常见场景给你具体的代码和解释:
场景1:筛选Carrier为US且分组记录数>1的组
如果你的需求就是保留carrier为US的分组,同时确保该组的记录数量大于1(其实US航空公司的航班数远不止1,这个条件更多是给你演示分组级筛选的逻辑),可以用filter()配合dplyr的分组函数n()来实现:
library(nycflights13) library(dplyr) # 别忘了加载dplyr,%>%、group_by这些函数都靠它 data <- flights data %>% group_by(carrier) %>% filter(carrier == "US", n() > 1) # n()会返回当前分组的总记录数
场景2:筛选Carrier为US且分组统计指标>1的组
如果你的“>1”是指其他统计指标(比如该航空公司的平均起飞延误时间大于1分钟),这里有两种实现方式,看你偏好哪种:
方式1:先计算分组指标再筛选(逻辑更清晰)
先通过summarise()算出每个航空公司的平均延误,再筛选符合条件的组:
data %>% group_by(carrier) %>% summarise(avg_dep_delay = mean(dep_delay, na.rm = TRUE)) %>% # 计算平均延误,忽略缺失值 filter(carrier == "US", avg_dep_delay > 1)
方式2:直接在分组后筛选(无需提前汇总)
如果你不想先生成汇总表,也可以直接在filter()里用聚合函数判断分组条件:
data %>% group_by(carrier) %>% filter(carrier == "US", mean(dep_delay, na.rm = TRUE) > 1)
小提醒
- 一定要记得加载
dplyr包哦,不然%>%、group_by这些函数会报错; n()是dplyr专门用来获取当前分组行数的函数,非常实用;- 如果你的“>1”是其他条件,只需要把代码里的
n()>1或者mean(dep_delay,...)>1替换成你需要的聚合条件就行啦。
内容的提问来源于stack exchange,提问作者Brandon Jablon
相关产品推荐
相关产品推荐

