R中的两个表达式应该产生相同的答案,但它们并没有

时间:2018-02-12 14:47:12

标签: r

我是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与其他人不同。谁能解释一下? 感谢您抽出宝贵时间回答这样一个基本问题。

1 个答案:

答案 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