假设我想以starwars
编程方式过滤数据框。这是一个简单的示例,可让我根据家庭世界和物种进行过滤:
library(tidyverse)
# a function that allows the user to supply filters
filter_starwars <- function(filters) {
for (filter in filters) {
starwars = filter_at(starwars, filter$var, all_vars(. %in% filter$values))
}
return(starwars)
}
# filter Star Wars characters that are human, and from either Tatooine or Alderaan
filter_starwars(filters = list(
list(var = "homeworld", values = c("Tatooine", "Alderaan")),
list(var = "species", values = "Human")
))
但这并不能让我指定高度过滤器,因为我已经在 of 中硬编码了运算%in%
符,而高度过滤器将使用, , ,或运算符之一.vars_predicate
filter_at()
>
>=
<
<=
==
编写filter_starwars()
函数的最佳方法是什么,以便用户可以提供足够通用的过滤器以沿任何列进行过滤并使用任何运算符?
注意使用现在已弃用的filter_()
方法,我可以传递一个字符串:
filter_(starwars, "species == 'Human' & homeworld %in% c('Tatooine', 'Alderaan') & height > 175")
但同样,这已被弃用。