r列表中有n个参数的连续筛选



我试图在不事先知道过滤器数量或其参数的情况下,在数据帧上应用连续的过滤器。争论被储存在一个列表中。有了1或2个过滤器,我可以用purrr来完成。

例如,有两个过滤器:

require(tidyverse) 
data("iris")
head(iris)
f2 <- list("Species" = "virginica", "Sepal.Length" = c(5.8, 6.3))
iris_f2 <- map2_df(.x = f2[[1]],
.y = f2[[2]],
.f = ~{
iris %>%
filter(get(names(f2)[1]) %in% .x,
get(names(f2)[2]) %in% .y)
})

# With 3 filters or more, I am completely stuck !
f3 <- list("Species" = "virginica", "Sepal.Length" = c(5.8, 6.3), "Sepal.Width" = 2.7)

我想概括我的代码,以便它应用列表中有n个参数的连续过滤器(n可以是1,也可以是2,就像我的例子中那样,或者更多(。

理想情况下,我想知道如何使用purrr,但我也对基于循环的解决方案感兴趣。

这里有一种方法可以使用call()来构造可以在filter()内部拼接的解基表达式。

library(purrr)
library(dplyr)

fns <- imap(f3, ~ call(if (length(.x) == 1) "==" else "%in%", sym(.y), .x))

它给出了以下内容:

$Species
Species == "virginica"
$Sepal.Length
Sepal.Length %in% c(5.8, 6.3)
$Sepal.Width
Sepal.Width == 2.7

然而,名称在拼接时会引起问题,因此在使用之前需要对其进行命名:

iris %>%
filter(!!!unname(fns))
Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
1          5.8         2.7          5.1         1.9 virginica
2          6.3         2.7          4.9         1.8 virginica
3          5.8         2.7          5.1         1.9 virginica

相关内容

最新更新