当我使用dplyr查询数据库时,我经常需要搜索字符串。通常,我使用%like%
,它可以充分发挥作用。但有时候,我宁愿使用正则表达式。如果我正在编写纯SQL,我会写一些类似的东西:
select pidm, jobtitle from people
where jobtitle REGEXP "^Athl.*train"
但当然,我想写一个整洁的R:
foo <- tbl(my_database,"people") %>%
filter(jobtitle %regexp% "^Athl.*train") %>%
select(pidm, jobtitle )
使用stringr::str_detect()
在SQL中不起作用。有没有办法继续编写tidyverse风格的代码,但仍然进行正则表达式搜索?
如果重要,我的数据库将在MySQL上运行。
答案 0 :(得分:2)
正确的dbplyr
不支持stringr
命令。我有PR,所以我们很快就会有这个。同时,您可以从INSTR
内调用SQL本机命令,例如filter()
,例如,您可以执行此操作:
foo <- tbl(my_database,"people") %>%
filter(instr("train", jobtitle)) > 0) %>%
select(pidm, jobtitle )
答案 1 :(得分:2)
最新版本的docs walkthrough 1.2.0支持多种字符串函数,包括str_detect()。所以,@ wtmatthias回答现在有效。
flights_db %>% select(origin, flight) %>% filter(stringr::str_detect(origin, 'JF'))
答案 2 :(得分:0)
我可能错了,但似乎您可能在R中使用“旧”方法进行SQL查询。如果您还不知道, dbplyr 是有点新发布,你需要安装(install.packages("dbplyr")
)&amp;用dplyr加载它。您应该能够在stringr::str_detect()
内使用filter()
。这个link应该为您提供dbplyr
如何使用/ dplyr所需的所有信息,并允许我们习惯的更多tidyverse风格。关于MySQL的说明也在链接中。
一个简单的例子:
library(nycflights13)
library(dbplyr)
nycflights13_sqlite(path = "path/for/sqlite")
con <- DBI::dbConnect(RSQLite::SQLite(), path = "path/for/sqlite")
copy_to(con, nycflights13::flights, "flights")
DBI::dbGetQuery(con, "SELECT origin, flight
FROM flights WHERE origin like '%JF%'")
flights_db <- tbl(con, "flights")
flights_db %>% select(origin, flight) %>% filter(stringr::str_detect(origin, 'JF'))