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

由于总是在主脚本中更改标准非常不方便,我开始将各种参数定义为 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/

10-11 19:33
查看更多