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
相关产品推荐
相关产品推荐

