R中dplyr的过滤器内部的外部函数

时间:2018-10-21 01:24:16

标签: r dplyr

dplyr :: filter内部的外部函数如何仅通过列名知道它们,而不使用来自它的data.frame?

例如,考虑以下代码:

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

is.na如何知道DepDelay来自hflights?我的代码中可能在其他地方定义了DepDelay向量。 (假设hflights具有名为“ Cancelled”,“ DepDelay”的列)。

在python中,我们将不得不使用列名称以及数据框的名称。因此,在这里我期望的是类似

!is.na(hflights$DepDelay)

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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包中的大多数函数都是专门为处理数据帧而设计的,所有这些函数都需要数据帧的名称作为其第一个参数。这允许使用管道(%>%),从而可以构建更直观的工作流程。认为管道等同于说“ ...然后……”。在上面显示的上下文中,您可以执行以下操作:

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

您将获得与上述相同的输出。结合管道的概念并将变量的词法范围集中于所引用的数据帧,意味着可以为人类带来更具可读性的代码,这是dplyrtidyr {{1}}是……的组成部分。