dplyr的filter_中的非标准评估(NSE),并从MySQL中提取数据

洛伦佐·罗西(Lorenzo Rossi)

我想从带有动态过滤器的sql服务器中提取一些数据。我通过以下方式使用了出色的R包dplyr:

#Create the filter
filter_criteria = ~ column1 %in% some_vector
#Connect to the database
connection <- src_mysql(dbname <- "mydbname", 
             user <- "myusername", 
             password <- "mypwd", 
             host <- "myhost") 
#Get data
data <- connection %>%
 tbl("mytable") %>% #Specify which table
 filter_(.dots = filter_criteria) %>% #non standard evaluation filter
 collect() #Pull data

这段代码可以正常工作,但是现在我想以某种方式在表的所有列上循环它,因此我想将过滤器编写为:

#Dynamic filter
i <- 2 #With a loop on this i for instance
which_column <- paste0("column",i)
filter_criteria <- ~ which_column %in% some_vector

然后使用更新的过滤器重新应用第一个代码。

不幸的是,这种方法无法获得预期的结果。实际上,它不会给出任何错误,但是甚至不会将任何结果拉入R。特别是,我仔细研究了两段代码生成的SQL查询,并且有一个重要的区别。

在第一个有效的代码生成以下形式的查询时:

SELECT ... FROM ... WHERE 
`column1` IN ....

(在列名中签名),第二个生成以下形式的查询:

SELECT ... FROM ... WHERE 
'column1' IN ....

(在列名中签名)

有人对如何制定过滤条件以使其起作用有任何建议吗?

马修

它与SQL无关。R中的此示例也不起作用:

df <- data.frame(
     v1 = sample(5, 10, replace = TRUE),
     v2 = sample(5,10, replace = TRUE)
)
df %>% filter_(~ "v1" == 1)

它不起作用,因为您需要传递给filter_表达式~ v1 == 1-而不是表达式~ "v1" == 1

要解决此问题,只需使用quoting运算符quo和dequoting运算符!!

library(dplyr)
which_column = quot(v1)
df %>% filter(!!which_column == 1)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章