首页 > 解决方案 > 两个 R 代码应该做同样的事情(至少在我的脑海里),有什么不同?

问题描述

为了复制此代码,您将需要以下软件包:Tidyverse、Nycflights13

我基本上试图理解为什么两段代码在我的脑海中应该做同样的事情,而不是做同样的事情。

我目前正在从 Garrett Grolemund 和 Hadley Wickham 的 R for Data Science 中学习 R for Data Science,并且我已经到了代码开始让我很困惑的地步,希望这是正常的!我将写下两段让我感到困惑的代码,为什么他们不做同样的事情!

filter(flights, dest == c("HOU","IAH"))
#and
filter(flights, dest == "HOU" | dest == "IAH")

我希望这两个代码都显示相同数量的行,但第一个显示 4658 行(错误数量),而第二个显示 9313(正确数量)。我想做的是通过使用 (filter(flights, dest == c("HOU","IAH"))) 而不是 (filter(flights, dest == "HOU" | dest == " IAH")) 但它会产生不同的结果,这让我非常困惑!请给我你的建议,我是新手!

标签: filterrstudio

解决方案


因为filter(flights, dest == c("HOU","IAH"))是一样的

filter(flights, dest == c("HOU","IAH"))
flights$dest = c("HOU","IAH")
* # For demonstation purposes, I'm assuming the flights dataset has has 4 rows, as:
c("HOU","CPH","IAH","EDI") == c("HOU","IAH")

现在,4 个元素的向量不可能与 2 个元素的向量相同。这将执行逐元素比较,"HOU" == "HOU", "CPH" == "IAH", "IAH" == ???. 所以 R 通过重复较短的向量来“帮助”我们。因此输出是:

> c("HOU","CPH","IAH","EDI") == c("HOU","IAH")
[1]  TRUE FALSE FALSE FALSE

尝试使用第 5 个元素进行扩展:

> c("HOU","CPH","IAH","EDI", "LDN") == c("HOU","IAH")
[1]  TRUE FALSE FALSE FALSE FALSE

警告消息:在 c("HOU", "CPH", "IAH", "EDI", "LDN") == c("HOU", "IAH") 中:较长的对象长度不是较短对象长度的倍数

你把它弄坏了。

因此,只有当且仅当 有 2 行时,第一行才有意义flights,因此可以执行逐元素比较。

但是,您可能正在寻找的是%in%运算符:

> c("HOU","CPH","IAH","EDI") %in% c("HOU","IAH")
[1]  TRUE FALSE  TRUE FALSE
> c("HOU","CPH","IAH","EDI","LDN") %in% c("HOU","IAH")
[1]  TRUE FALSE  TRUE FALSE FALSE

它可以扩展到filter(flights, dest %in% c("HOU","IAH"))并且幸运地适用于任何长度的向量。


推荐阅读