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

R中filter函数两种筛选写法的差异及hflights航班统计实现

嘿,我来帮你理清楚如何统计hflights数据集中飞往SFO或OAK的航班数量,还有你提到的两种filter写法的核心差异~

统计飞往SFO/OAK的航班数量

首先先加载并整理数据集:

library(hflights)
flights <- tbl_df(hflights)

下面是三种可行的实现方法:

方法一:管道符+逻辑或(|)

用dplyr的管道语法结合逻辑或运算符,明确指定两个目的地:

# 筛选符合条件的航班
dest_flights <- flights %>% filter(Dest == "SFO" | Dest == "OAK")
# 统计数量
nrow(dest_flights)
# 也可以一步到位
flights %>% filter(Dest == "SFO" | Dest == "OAK") %>% nrow()

方法二:%in%运算符(推荐)

这种写法更简洁,尤其适合需要匹配多个值的场景:

# 筛选符合条件的航班
dest_flights <- filter(flights, Dest %in% c("SFO", "OAK"))
# 统计数量
nrow(dest_flights)

方法三:Base R的subset函数

如果习惯用Base R的语法,也可以这样写:

dest_flights <- subset(flights, Dest %in% c("SFO", "OAK"))
nrow(dest_flights)
两种filter写法的关键差异

重点说下filter(dataframe, var %in% c(x,y,z))和filter(dataframe, var == c(x,y,z))的区别,这俩完全不是一回事:

  • %in%是正确的多值匹配方式:它会逐行检查变量值是否存在于右侧的向量中,返回一个和数据集行数一致的布尔向量,所有符合“属于目标集合”条件的行都会被保留。比如Dest %in% c("SFO", "OAK")就是判断每一行的Dest是不是SFO或者OAK,结果完全符合我们的需求。

  • == c(x,y,z)是错误的用法:这里R会触发**循环补齐(recycling)**机制——把右侧的向量重复到和左侧变量长度一致,然后逐位置比较。举个例子,如果你的数据集有5行,Dest == c("SFO", "OAK")会变成:第1行和"SFO"比,第2行和"OAK"比,第3行和"SFO"比,第4行和"OAK"比,第5行和"SFO"比。这根本不是“匹配任意一个目标值”的逻辑,会得到完全错误的筛选结果。

给你看个直观的小例子:

test_df <- tibble(Dest = c("SFO", "LAX", "OAK", "SFO", "DAL"))

# 用%in%的正确结果
filter(test_df, Dest %in% c("SFO", "OAK"))
# 输出:保留第1、3、4行,符合预期

# 用== c(...)的错误结果
filter(test_df, Dest == c("SFO", "OAK"))
# 输出:只保留第1行,完全不符合需求

所以记住:要匹配多个值中的任意一个时,一定要用%in%,绝对别用== c(...)!

内容的提问来源于stack exchange,提问作者gourab chanda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:01:18