dplyr :: filter内部的外部函数如何仅通过列名知道它们,而不使用来自它的data.frame?
例如,考虑以下代码:
filter(hflights, Cancelled == 1, !is.na(DepDelay))
is.na如何知道DepDelay来自hflights?我的代码中可能在其他地方定义了DepDelay向量。 (假设hflights具有名为“ Cancelled”,“ DepDelay”的列)。
在python中,我们将不得不使用列名称以及数据框的名称。因此,在这里我期望的是类似
!is.na(hflights$DepDelay)
任何帮助将不胜感激。
答案 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(警告,这本书正在进行中)。
dplyr
和tidyr
包中的大多数函数都是专门为处理数据帧而设计的,所有这些函数都需要数据帧的名称作为其第一个参数。这允许使用管道(%>%
),从而可以构建更直观的工作流程。认为管道等同于说“ ...然后……”。在上面显示的上下文中,您可以执行以下操作:
iris %>%
select(-Species) %>%
filter(Species == "setosa")
您将获得与上述相同的输出。结合管道的概念并将变量的词法范围集中于所引用的数据帧,意味着可以为人类带来更具可读性的代码,这是dplyr
和tidyr
{{1}}是……的组成部分。