【问题标题】:How does dplyr’s between work?dplyr 之间是如何工作的?
【发布时间】:2017-02-21 04:10:55
【问题描述】:

我已阅读文档并尝试使用谷歌搜索;这应该是一件简单的事情,但对我来说似乎不是;所以我大胆地去问这里是否有人可以解释一下 dplyr 的between() 是如何工作的。

# Explanation documentation
between(x, left, right)

x            A numeric vector of values
left, right: Boundary values

我知道向量是一维数组,所以我想c(1:7) 是一个向量,对吧?我尝试使用文档中提供的示例作为模板来搜索 7 月至 9 月的航班,但以下只是返回错误:

# Example from documentation cont’d
x <- rnorm(1e2)
x[between(x, -1, 1)]

# Loading the library
library(nycflights13)

# Execute my hopeless attempt at between()
flights[between(month, 7, 9)]

# Output and error message
> flights[between(month, 7, 9)]
Error in between(month, 7, 9) : object 'month' not found

我觉得问这个真的很愚蠢,但任何有助于理解这一点的帮助将不胜感激。我也为没有提出明确的问题而道歉;可能很感激,除了“我不明白”之外,我真的不知道如何表达它。

【问题讨论】:

  • 这不是关于变量之间的问题,而是关于定义变量的问题:您正在过滤您的数据框flights,方法是说“在变量月份保持在 7 到 9 之间的行”。但是month 没有定义,R 会告诉你。你宁愿找flights[between(flights$month, 7, 9)]。
  • 如果想让R理解month指的是flights范围内的列名,可以这样做:with(flights, flights[between(month, 7, 9)])
  • R 人开发了几个概念,例如 base、tidyverse 和 data.table。子集和其他东西的工作方式有点不同,这经常令人困惑。 dplyr 及其 between() 是 tidyverse 的一部分。最好的使用方式可能是flights %&gt;% filter(between(month, 7, 9)) 或filter(flights, between(month, 7, 9))。您尝试了 base-R 子集。这也有效(您可以混合使用),但需要进行上述调整。

标签: r dplyr


【解决方案1】:

filter(flights, between(month, 7,9)) 似乎工作得很好

【讨论】:

    【解决方案2】:

    between 没什么特别的——R 中的任何其他函数都会导致同样的问题。您的困惑源于 dplyr 有很多函数可以让您处理 data.frame 列名,就好像它们是普通变量一样;例如:

    filter(flights, month > 9)
    

    但是,between 不是这些功能之一。如前所述,这只是一个正常的功能。所以如果你想使用它,你需要以常规方式提供参数;例如:

    between(flights$month, 7, 9)
    

    这将返回一个逻辑向量,您现在可以使用它来索引您的 data.frame:

    flights[between(flights$month, 7, 9), ]
    

    或者,更像 dplyr:

    flights %>% filter(between(month, 7, 9))
    

    请注意,这里我们现在使用非标准评估。但是评估是由filter 执行的,而不是由between 执行的。 between 使用标准评估调用(由filter)。

    【讨论】:

    • 我相信这个答案回答了我所有的问题,而且也很好。感谢您展示如何处理数据集中的特定列,以及如此礼貌和中肯的回答。不过,我很好奇,我应该如何理解您提供的第二行代码的输出(between(flights$month, 7, 9); 它产生了一个巨大的布尔值列表(所有这些都是FALSE)
    • @CannedMan between 的输出是对“X 中的值是否在我的范围内?”问题的答案。因此,如果我问between(c(5, 3, 4, 6, 2, 9, 3), 3, 7),我会得到答案 TRUE、TRUE、TRUE、TRUE、FALSE、FALSE、TRUE。如果您的所有值都是 FALSE,这意味着 flights 数据集中的月份都不在 7 到 9 之间。
    • 你如何让它不包含边界?即x &gt; left &amp; x &lt; right
    • @ÖmerAn 没有特定的功能,所以只需使用您在评论中编写的代码即可。当然,您可以将其包装到您自己的函数中。
    【解决方案3】:

    我猜你想要这样:

    library(nycflights13)
    library(dplyr)
    
    flights %>% filter(between(month,7,9))
    

    我同时看到这个解决方案也出现在 cmets 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2022-01-15
      • 2018-01-14
      • 2012-04-15
      • 1970-01-01
      相关资源
      最近更新 更多