2017-09-14 4 views
0

Wenn ich eine Datenbank mit dplyr abfrage, muss ich oft Strings suchen. Normalerweise verwende ich %like%, die ausreichend funktioniert. Manchmal benutze ich lieber reguläre Ausdrücke. Wenn ich rein SQL schrieb, würde ich so etwas wie schreiben:Gibt es eine Möglichkeit, REGEXP innerhalb einer Datenbankabfrage zu verwenden?

select pidm, jobtitle from people 
where jobtitle REGEXP "^Athl.*train" 

Aber natürlich würde Ich mag tidyverse-Stil R schreiben:

foo <- tbl(my_database,"people") %>% 
    filter(jobtitle %regexp% "^Athl.*train") %>% 
    select(pidm, jobtitle) 

stringr::str_detect() Verwendung nicht funktioniert in SQL. Gibt es eine Möglichkeit, weiterhin Code im Stil von "Reverse-style" zu schreiben, aber die Suche nach Stil immer wieder zu ändern?

Wenn es darauf ankommt, läuft meine Datenbank auf MySQL.

Antwort

0

die dbplyr korrekt ist nicht stringr Befehle unterstützt, noch nicht. Ich habe PR dafür, also werden wir das hoffentlich bald haben. In der Zwischenzeit können Sie einen SQL Native Command aufrufen, wie INSTR aus filter(), so zum Beispiel können Sie dies tun:

foo <- tbl(my_database,"people") %>% 
      filter(instr("train", jobtitle)) > 0) %>% 
      select(pidm, jobtitle) 
0

Ich könnte falsch sein, aber es scheint, wie Sie die „alte“ Methode für SQL Abfragen w/in R. verwenden könnte Wenn Sie nicht bereits wissen, dbplyr ist etwas neu freigegeben und Sie müssen installieren (install.packages("dbplyr")) & laden Sie es mit dplyr. Sie sollten stringr::str_detect() innerhalb von filter() an diesem Punkt verwenden können. Diese link sollte Ihnen alle Informationen geben, die Sie brauchen, damit dbplyr w/dplyr funktioniert und für mehr des ordentlichen Stils erlaubt, den wir gewohnt sind. Es gibt auch einen Hinweis zu MySQL im Link.

Ein einfaches Beispiel:

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')) 
+0

Hm. Ich kann nicht scheinen, dass dies mit meiner Datenbank zu arbeiten - ich bekomme ähnliche Fehler, wenn ich versuche, vergleichbaren Code oder sogar mit Ihrem Beispiel gegen meinen Server zu schreiben (ich bekomme einen Fehler: Fehler in stri_detect_regex (string, pattern, opts_regex = opts (pattern)): Objekt 'Herkunft' nicht gefunden – crazybilly

+1

Ich bin ein Idiot.Verwandte das gleiche Problem.Ich lese eine derzeit offene PR als eine engagierte, wenn es [nicht] ist (https://github.com/tidyverse/dbplyr/pull/35). Sieht aus wie 'stringr' wird immer noch nicht unterstützt mit' dplyr' unter der aktuellen Version. (Obwohl basierend auf dieser PR sieht es aus, als könnte es nah sein.) Sorry! Gonna Antwort löschen, da es irrelevant ist. – wtmatthias

0

Die neueste Version von dbplyr 1.2.0 unterstützt mehrere stringr Funktionen, einschließlich str_detect() . Also, @wtmatthias Antwort funktioniert jetzt.

flights_db %>% select(origin, flight) %>% filter(stringr::str_detect(origin, 'JF')) 
Verwandte Themen