【问题标题】:External functions inside filter of dplyr in RR中dplyr过滤器内部的外部函数
【发布时间】:2018-10-21 01:24:16
【问题描述】:

dplyr::filter 内部的外部函数如何在不使用其来源的 data.frame 的情况下仅通过名称知道列?

例如考虑以下代码:

filter(hflights, Cancelled == 1, !is.na(DepDelay))

is.na 如何知道 DepDelay 来自 hflights?我的代码中的其他地方可能已经定义了一个 DepDelay 向量。 (假设 hflights 有名为 'Cancelled'、'DepDelay' 的列)。

在 python 中,我们必须使用列名和数据框的名称。因此,我在这里期待类似的东西

!is.na(hflights$DepDelay)

任何帮助将不胜感激。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    虽然我不是专家,无法给出准确的答案,但希望我不会让你误入歧途。

    本质上是环境问题。 filter() 首先在其第一个参数中命名的数据框环境中查找任何向量对象。如果它没有找到它,它就会“上一级”,可以这么说,到全局环境并寻找该名称的任何其他矢量对象。考虑:

    library(dplyr)
    
    Species <- iris$Species
    iris2 <- select(iris, -Species) # Remove the Species variable from the data frame.
    
    filter(iris2, Species == "setosa")
    #>    Sepal.Length Sepal.Width Petal.Length Petal.Width
    #> 1           5.1         3.5          1.4         0.2
    #> 2           4.9         3.0          1.4         0.2
    #> 3           4.7         3.2          1.3         0.2
    #> 4           4.6         3.1          1.5         0.2
    #> 5           5.0         3.6          1.4         0.2
    

    有关该主题的更多信息可以找到here(警告,这本书正在编写中)。

    dplyrtidyr 包中的大多数函数都是专门为处理数据帧而设计的,所有这些函数都需要数据帧的名称作为它们的第一个参数。这允许使用管道 (%&gt;%),从而构建更直观的工作流程。将管道想象成相当于说“......然后......”。在上面显示的上下文中,您可以这样做:

    iris %>% 
      select(-Species) %>% 
      filter(Species == "setosa")
    

    你得到与上面相同的输出。结合管道的概念并将变量的词法范围集中在引用的数据帧上,旨在为人类带来更易读的代码,这是 tidyverse 包集的原则之一,dplyr 和 @987654329 @ 是的组成部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2020-02-08
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多