gpt4 book ai didi

r - 如何使用dplyr和整洁的评估以编程方式过滤数据帧?

转载 作者:行者123 更新时间:2023-12-04 11:05:03 25 4
gpt4 key购买 nike

假设我要以编程方式过滤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")
))

但这不能让我指定高度过滤器,因为我已经在 %in%.vars_predicate中对 filter_at()运算符进行了硬编码,并且高度过滤器将使用 >>=<<===之一运算符(operator)

编写 filter_starwars()函数的最佳方法是什么,以便用户可以提供足够通用的过滤器以沿任何列进行过滤并使用任何运算符?

注意,使用现在不建议使用的 filter_()方法,我可以传递一个字符串:
filter_(starwars, "species == 'Human' & homeworld %in% c('Tatooine', 'Alderaan') & height > 175")

但是,这已经过时了。

最佳答案

尝试

filter_starwars <- function(...) {
F <- quos(...)
filter(starwars, !!!F)
}

filter_starwars(species == 'Human', homeworld %in% c('Tatooine', 'Alderaan'), height > 175)
# # A tibble: 7 × 13
# name height mass hair_color skin_color eye_color birth_year
# <chr> <int> <dbl> <chr> <chr> <chr> <dbl>
# 1 Darth Vader 202 136 none white yellow 41.9
# 2 Owen Lars 178 120 brown, grey light blue 52.0
# 3 Biggs Darklighter 183 84 black light brown 24.0
# 4 Anakin Skywalker 188 84 blond fair blue 41.9
# 5 Cliegg Lars 183 NA brown fair blue 82.0
# 6 Bail Prestor Organa 191 NA black tan brown 67.0
# 7 Raymus Antilles 188 79 brown light brown NA
# # ... with 6 more variables: gender <chr>, homeworld <chr>, species <chr>,
# # films <list>, vehicles <list>, starships <list>

参见 https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html。简而言之, quos...捕获为列表,而不评估参数。 !!!filter()中的求值参数进行拼接和取消引用。

关于r - 如何使用dplyr和整洁的评估以编程方式过滤数据帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45134317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com