r 连续过滤列表中的 n 个参数
r successive filtering with n arguments in a list
我正在尝试在数据帧上应用连续的过滤器,但事先不知道过滤器的数量或它们的参数。参数存储在列表中。使用 1 或 2 个过滤器,我可以用 purrr 做到这一点。
例如有 2 个过滤器:
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
我正在尝试在数据帧上应用连续的过滤器,但事先不知道过滤器的数量或它们的参数。参数存储在列表中。使用 1 或 2 个过滤器,我可以用 purrr 做到这一点。
例如有 2 个过滤器:
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