我是R的新手,目前正在通过R for Data Science来自学一些基础知识。我正在研究第5.2.4章中的练习,当这样做试图创建两个版本的过滤代码时,我假设它们是等效的。
为此,我加载了以下包:
library(nycflights13)
library(tidyverse)
然后我想从午夜到早上6点之间离开的包含航班数据集中过滤掉这些航班。我使用了以下代码:
d1 <- filter(flights, dep_time >= 0 & dep_time <= 600) #yields 9344 rows
d2 <- flights[between(flights$dep_time, 0 , 600),] # yields 17599 rows
d3 <- filter(flights, between(dep_time,0,600)) #again yields 9344 rows
我无法弄清楚为什么d2与其他人不同。谁能解释一下? 感谢您抽出宝贵时间回答这样一个基本问题。
答案 0 :(得分:3)
除了TRUE / FALSE之外还有丢失的元素返回NA,当我们将NA作为逻辑元素之一时,返回的行将是NA。这可能是我们有更多行数的原因。
sum(between(flights$dep_time, 0 , 600), na.rm = TRUE)
#[1] 9344
filter
将考虑NA
元素并删除那些NA元素
一种选择是将NA
元素返回为“FALSE
i1 <- between(flights$dep_time, 0, 600) & !is.na(flights$dep_time)
d2 <- flights[i1,]
dim(d2)
#[1] 9344 19