如何将过滤器表达式存储为字符串?

时间:2019-02-02 14:52:20

标签: r string filter parameters

对于物种数据库的分析,我经常需要根据项目范围等来更改很多标准。

由于总是在主脚本本身中更改条件非常不便,因此我开始在 exterior parameters.R 文件中将各种参数定义为变量,该文件将被复制到项目特定的文件夹中并在那里进行调整,并将其从 main.R 文件中获取。

这很好用,但是现在我要过滤表达式,我找不到在参数文件中将它们存储为字符串的方法。

标准过滤器表达式将是以下表达式:

 rlb == "1" | rlb == "2" | rlb== "3" | rlb == "G" | rlb == "R" | rld ==
 "1" | rld == "2" | rld== "3" | rld == "G" | rld == "R" | ffh2 > 1 | ffh4
 == 1 | ffh5 == 1 | spa1 == 1 | sap == 1

由于某些参数中的"",我无法将其分配为字符串变量,原因是R抱怨存在未知的标记或对象。

如何将此过滤器表达式分配给变量,以便以后使用(例如用eval(my_filter_variable)等执行我的过滤?

2 个答案:

答案 0 :(得分:2)

filter_

您可以使用filter_中的dplyr传递过滤表达式:

mtcars %>%
    filter_("cyl == 4")

处理字符串

假设您想进一步处理字符串,可以将 '' 用于过滤器中的字符串:

data.frame(col_A = LETTERS[1:10],
           col_B = 1:10,
           stringsAsFactors = FALSE) %>%
    filter_("col_A == 'A'")

处理"

如果您真的想将字符串作为"传递,则必须转引号:

data.frame(col_A = LETTERS[1:10],
           col_B = 1:10,
           stringsAsFactors = FALSE) %>%
    filter_("col_A == \"A\"")

更好的方法

我建议您避免使用上述方法。看看下面的建议,让您使用sym函数传递列名。在dplyr管道中,您可以使用rlang,这将使您在构建过滤器表达式时更具灵活性:

require(dplyr)
require(rlang)
col_nme <- sym("cyl")
flt_val <- 4
mtcars %>%
    filter(UQ(col_nme) == UQ(flt_val))

这等效于:

mtcars %>%
    filter(UQ(col_nme) == flt_val)

因为您不必取消引用第二个参数。

侧边点

过滤器的语法为:

rlb == "1" | rlb == "2" | rlb== "3" | rlb == "G" | rlb == "R" |

这等同于:

rlb %in% c("1", "2", "3" , "G" , "R")

向量c("1", "2", "3", "G", "R")可以很容易地作为变量传递,而无需任何涉及定量或非标准评估的额外工作。我将从简化过滤器开始,然后通过rlang功能使用简化的表达式。


代码共享

在评论代码共享之后,最好看一下sqldf软件包:

require(sqldf)
sqldf(x = "SELECT * FROM mtcars WHERE CYL = 4")

这可以让您在SQL中共享过滤器,这种语法通常比dplyr语法更熟悉。

答案 1 :(得分:2)

在除了@康拉德的方法中,如果表达式是一个字符串,则我们可以使用parse_exprrlang

library(rlang)
library(dplyr)
df1 %>% 
    filter(!! parse_expr(expr1))
#   col_A col_B
#1     A     1

数据

 df1 <- data.frame(col_A = LETTERS[1:10],
           col_B = 1:10,
           stringsAsFactors = FALSE)

expr1 <-  "col_A == 'A' & col_B == 1"