我试图在数据帧上应用连续的过滤器,而不事先知道过滤器的数量或它们的参数.参数存储在一个列表中.使用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

R相关问答推荐

跨列应用多个摘要函数:summerise_all:列表对象无法强制为double类型'

从R中的另一个包扩展S3类的正确方法是什么

更改绘图上的x轴断点,而不影响风险?

如何计算前一行的值,直到达到标准?

过滤器数据.基于两列的帧行和R中的外部向量

如何写一个R函数来旋转最后n分钟?

在ggplot2中更改小提琴情节的顺序

在数组索引上复制矩阵时出错

解析R函数中的变量时出现的问题

如何识别倒排的行并在R中删除它们?

将多个列值转换为二进制

来自程序包AFEX和amp;的类/函数和NICE_TABLE&冲突

仅当后续值与特定值匹配时,才在列中回填Nas

通过初始的shiny 应用更新部署的shiny 应用的数据和参数,其中部署的应用程序显示为URL

为R中的16组参数生成10000个样本的有效方法是什么?

网络抓取新闻标题和时间

如何将图例文本添加到图例符号中

了解nchar在列表上的意外行为

将字符变量出现次数不相等的字符框整形为pivot_wider,而不删除重复名称或嵌套字符变量

R data.设置函数&;连接中的列值而不使用for循环的表方法?