对于物种数据库的分析,我经常需要根据项目范围等来更改很多标准。
由于总是在主脚本本身中更改条件非常不便,因此我开始在 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)
等执行我的过滤?
答案 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_expr
从rlang
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"