filter - 两个 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")) 但它会产生不同的结果,这让我非常困惑!请给我你的建议,我是新手!
解决方案
因为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"))
并且幸运地适用于任何长度的向量。
推荐阅读
- node.js - 带有 React 和 OIDC 身份验证的 Electron 在 DEV 工作,但在 PROD 失败
- python - 如何在 Python numpy 中将行和列变成变量?
- git - GitHub存储库中的文件在哪里?
- ruby-on-rails - Ruby on Rails - 参数丢失或值为空
- azure - 我们应该将什么服务连接添加到 Azure 管道中的“调用 REST API:POST”
- r - 用于删除组内值的 R 代码
- c# - Asp.Net Core 3.1 MVC 使用代码优先迁移创建 NLog 表模式
- python - 寻找解释 Python 语法选项的资源
- authentication - Azure DevOps 私有 Linux 代理 - YAML 管道签出失败 - 可以使用“git config --global --unset http.extraHeader”修复,但还不够早
- jquery - 如何在角度选择中获取选项的值?