对于物种数据库的分析,我经常需要更改很多标准,具体取决于项目范围等。
由于总是在主脚本中更改标准非常不方便,我开始将各种参数定义为 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)
等来执行我的过滤? 最佳答案
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")
可以轻松地作为变量传递,无需任何涉及 quosures 或非标准评估的额外工作。我将从简化过滤器开始,然后通过 rlang
功能使用简化的表达式。代码共享
跟着代码分享的评论,看下
sqldf
包可能会不错:require(sqldf)
sqldf(x = "SELECT * FROM mtcars WHERE CYL = 4")
这将使您可以在 SQL 中共享您的过滤器,这通常比
dplyr
语法更熟悉。关于r - 如何将过滤器表达式存储为字符串?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54494173/