使用 dplyr 过滤器中的函数

Akh*_*air 6 r filter dplyr

我想定义一个辅助函数来帮助我更清楚地编写一些布尔过滤器。

\n

iris这是使用数据集结果的工作示例

\n
library(tidyverse)\n\n\nsepal_config = function(length, width, species, .data) {\n  .data$Sepal.Length > length & .data$Sepal.Width < width & .data$Species == species\n}\n\niris %>% \n  filter(\n      sepal_config(length = 4, width = 3, species = "versicolor", .data = .data) |  # 34 rows\n      sepal_config(length = 3, width = 3, species = "virginica",  .data = .data)    # 21 rows\n    )                                                                               # 55 rows\n
Run Code Online (Sandbox Code Playgroud)\n

我想在不必传入 的情况下执行此操作.data,并且理想情况下还可以在数据帧范围内评估列名称(即避免此错误)

\n
sepal_config = function(length, width, species) {\n  Sepal.Length > length & Sepal.Width < width & Species == species\n}\n\niris %>% \n  filter(\n      sepal_config(length = 4, width = 3, species = "versicolor") |\n      sepal_config(length = 3, width = 3, species = "virginica")\n    )                                                               \n
Run Code Online (Sandbox Code Playgroud)\n
Error: Problem with `filter()` input `..1`.\n\xe2\x84\xb9 Input `..1` is `|...`.\nx object \'Sepal.Length\' not found\n
Run Code Online (Sandbox Code Playgroud)\n

不幸的是,我对 NSE 的了解不够深入,不知道这是否是一个选择。我已经尝试了dplyr 编程指南中的各种技术,但脚注让我觉得我找错了地方。

\n
\n

dplyr\xe2\x80\x99sfilter()的灵感来自于基础 R\xe2\x80\x99s subset()subset()提供数据屏蔽,但不提供整洁的评估,因此本章中描述的技术不适用于它。

\n
\n

谢谢,\n阿克希尔

\n

H 1*_*H 1 4

您可以将表达式包装在函数中,quo()并使用!!运算符在调用中消除它filter()

library(dplyr)

sepal_config = function(length, width, species) {
  quo(Sepal.Length > length & Sepal.Width < width & Species == species)
  }

iris %>% 
  filter(!!sepal_config(length = 4, width = 3, species = "versicolor") |
         !!sepal_config(length = 3, width = 3, species = "virginica"))


   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1           5.5         2.3          4.0         1.3 versicolor
2           6.5         2.8          4.6         1.5 versicolor
3           5.7         2.8          4.5         1.3 versicolor
4           4.9         2.4          3.3         1.0 versicolor
5           6.6         2.9          4.6         1.3 versicolor
6           5.2         2.7          3.9         1.4 versicolor
7           5.0         2.0          3.5         1.0 versicolor
8           6.0         2.2          4.0         1.0 versicolor
9           6.1         2.9          4.7         1.4 versicolor
10          5.6         2.9          3.6         1.3 versicolor
...
Run Code Online (Sandbox Code Playgroud)