首页 > 解决方案 > filter() 未按预期运行的奇怪案例

问题描述

我参考了 R 的数据科学书https://r4ds.had.co.nz/transform.html该程序检查每天有多少起飞时间早于 500 的航班。

从文字:

library(nycflights13)
library(tidyverse)
not_cancelled <- flights %>% 
  filter(!is.na(dep_delay), !is.na(arr_delay))

not_cancelled %>% 
  group_by(year, month, day) %>% 
  summarise(n_early = sum(dep_time < 500))

-> 365 x 4

但是,另一种代码:

library(nycflights13)
library(tidyverse)
not_cancelled <- flights %>% 
  filter(!is.na(dep_delay), !is.na(arr_delay))

not_cancelled %>% 
  group_by(year, month, day) %>% 
  select(year:day, dep_time) %>%
  filter(dep_time < 500) %>%
  count()

-> 不能产生相同的结果。相反,输出为 348 x 4。

我无法弄清楚原因。

标签: rfilter

解决方案


问题是第二个在产生结果之前删除了所有的零天。第一个有 17 天的计数为零,这是造成差异的原因。

library(nycflights13)
library(tidyverse)
not_cancelled <- flights %>% 
  filter(!is.na(dep_delay), !is.na(arr_delay))


tmp1 <- not_cancelled %>% 
  group_by(year, month, day) %>% 
  summarise(n_early = sum(dep_time < 500))
sum(tmp1$n_early == 0)
# [1] 17


tmp2 <- not_cancelled %>% 
  group_by(year, month, day) %>% 
  select(year:day, dep_time) %>%
  filter(dep_time < 500) %>%
  count()

sum(tmp2$n == 0)
# [1] 0

推荐阅读