gpt4 book ai didi

r - 对多个dplyr过滤条件使用整洁的评估

转载 作者:行者123 更新时间:2023-12-04 11:09:29 24 4
gpt4 key购买 nike

我是不熟悉eval并尝试编写通用函数的新手-我现在正努力解决的一件事是为分类变量编写多个过滤条件。这就是我现在正在使用的

create_expr <- function(name, val){
if(!is.null(val))
val <- paste0("c('", paste0(val, collapse = "','"), "')")
paste(name, "%in%", val)
}

my_filter <- function(df, cols, conds){
# Args:
# df: dataframe which is to be filtered
# cols: list of column names which are to be filtered
# conds: corresponding values for each column which need to be filtered

cols <- as.list(cols)
conds <- as.list(conds)

args <- mapply(create_expr, cols, conds, SIMPLIFY = F)

if(!length(args))
stop(cat("No filters provided"))

df <- df %>% filter_(paste(unlist(args), collapse = " & "))
return(df)
}

my_filter(gapminder, cols = list("continent", "country"),
conds = list("Europe", c("Albania", "France")))

我想知道如何使用整洁的评估实践将其重写。我已经找到了关于对多个参数使用quos()的资料,但是如您所见,这里有两个不同的参数列表,它们需要相互映射。

任何帮助表示赞赏,谢谢!

最佳答案

使用tidyverse,您可以将该函数重写为

library(dplyr)
library(purrr) # for map2()

my_filter <- function(df, cols, conds){
fp <- map2(cols, conds, function(x, y) quo((!!(as.name(x))) %in% !!y))
filter(df, !!!fp)
}

my_filter(gapminder::gapminder, cols = list("continent", "country"),
conds = list("Europe", c("Albania", "France")))

这相当于
filter(gapminder, continent %in% "Europe", country %in% c("Albania", "France"))

起作用的主要原因是您可以将多个参数传递给 filter(),并且它们与 &隐式组合。 map2()只是 mapply的一个tidyverse等效项,带有两个要迭代的对象。

关于r - 对多个dplyr过滤条件使用整洁的评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49075824/

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