【发布时间】:2021-11-30 21:29:24
【问题描述】:
我想定义一个辅助函数来帮助我更清楚地组合一些布尔过滤器。
这是使用iris 数据集的结果的工作示例
library(tidyverse)
sepal_config = function(length, width, species, .data) {
.data$Sepal.Length > length & .data$Sepal.Width < width & .data$Species == species
}
iris %>%
filter(
sepal_config(length = 4, width = 3, species = "versicolor", .data = .data) | # 34 rows
sepal_config(length = 3, width = 3, species = "virginica", .data = .data) # 21 rows
) # 55 rows
我想这样做而不必传入.data,并且理想情况下还要在数据框范围内评估列名(即避免此错误)
sepal_config = function(length, width, species) {
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")
)
Error: Problem with `filter()` input `..1`.
ℹ Input `..1` is `|...`.
x object 'Sepal.Length' not found
不幸的是,我对 NSE 的了解不够深入,无法知道这是否是一种选择。我尝试了programming with dplyr 操作指南中的各种技术,但脚注让我觉得我找错地方了。
dplyr 的
filter()的灵感来自 base R 的subset()。subset()提供数据屏蔽,但不提供整洁的评估,因此本章描述的技术不适用于它。
谢谢, 阿基尔
【问题讨论】:
-
所有
dplyr函数filter、summarise、mutate、group_by都有数据作为第一个参数。为什么要避免这种情况?如果您希望避免它,您希望如何从数据中获取Sepal.Length等值。或者你只是想避免重复调用.data$?