Skip to main content
 首页 » 编程设计

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

2024年09月07日15langtianya

我想从带有动态过滤器的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表达式。

要解决此问题,只需使用引号运算符 quo和引号运算符 !!
library(dplyr) 
which_column = quot(v1) 
df %>% filter(!!which_column == 1)