2016-08-15 7 views
2

Ich verwende dplyr 's automatische SQL-Backend abfrage Untertabelle aus einer Datenbanktabelle. Z.B.Übergeben Sie SQL-Funktionen in dplyr -Filterfunktion auf Datenbank

my_tbl <- tbl(my_db, "my_table") 

wo my_table in der Datenbank

batch_name value 
batch_A_1  1 
batch_A_2  2 
batch_A_2  3 
batch_B_1  8 
batch_B_2  9 
... 

wie

sieht ich nur die Daten von batch_A_# will, unabhängig von der Zahl.

Wenn ich dies in SQL geschrieben haben, konnte ich

select * where batch_name like 'batch_A_%' 

verwenden, wenn ich in R Schreiben wurden diese, ich ein paar Möglichkeiten nutzen könnten diese zu bekommen: grepl(), %in% oder str_detect()

# option 1 
subtable <- my_tbl %>% select(batch_name, value) %>% 
    filter(grepl('batch_A_', batch_name, fixed = T)) 
# option 2 
subtable <- my_tbl %>% select(batch_name, value) %>% 
    filter(str_detect(batch_name, 'batch_A_')) 

All diese gibt den folgenden Postgres Fehler: HINT: No function matches the given name and argument types. You might need to add explicit type casts

Also, wie gehe ich in Funktionen SQL-Zeichenfolge oder passendes fu Funktionen, um die generierte dplyr SQL-Abfrage in die Lage zu versetzen, einen flexibleren Bereich von Funktionen in filter zu verwenden?

(FYI die %in% Funktion funktioniert, erfordert aber alle möglichen Werte Auflistung aus. Dies wäre in Ordnung mit paste kombiniert, um eine Liste zu machen, funktioniert aber nicht in einem allgemeineren regex Fall)

+1

Does not 'tbl (my_db, SQL (select * wo BATCH_NAME% wie% 'batch_A _%'))' Arbeit – shayaa

+0

@shayaa Sorry für die Verspätung, natürlich stimmt das! Bei komplizierteren Abfragen bin ich mir nicht sicher, ob das immer funktioniert, aber ich kann mir im Moment kein Gegenbeispiel vorstellen. Vielen Dank! –

Antwort

1


A "dplyr -nur" Lösung wäre diese

tbl(my_con, "my_table") %>% 
    filter(batch_name %like% "batch_A_%") %>% 
    collect() 

Voll reprex:

suppressPackageStartupMessages({ 
    library(dplyr) 
    library(dbplyr) 
    library(RPostgreSQL) 
}) 

my_con <- 
    dbConnect(
    PostgreSQL(), 
    user  = "my_user", 
    password = "my_password", 
    host  = "my_host", 
    dbname = "my_db" 
) 

my_table <- tribble(
    ~batch_name, ~value, 
    "batch_A_1",  1, 
    "batch_A_2",  2, 
    "batch_A_2",  3, 
    "batch_B_1",  8, 
    "batch_B_2",  9 
) 

copy_to(my_con, my_table) 

tbl(my_con, "my_table") %>% 
    filter(batch_name %like% "batch_A_%") %>% 
    collect() 
#> # A tibble: 3 x 2 
#> batch_name value 
#> *  <chr> <dbl> 
#> 1 batch_A_1  1 
#> 2 batch_A_2  2 
#> 3 batch_A_2  3 

dbDisconnect(my_con) 
#> [1] TRUE 

Dies funktioniert, weil alle Funktionen, die nicht wissen, wie man dplyr übersetzen entlang wie es ist vergangen, siehe ?dbplyr::translate\_sql.

Hat-Spitze zu @PaulRougieux für seinen letzten Kommentar here

1

dplyr Verwendung

Die Tabelle Batchname aus der Datenbank als Datenframe abrufen und für die weitere Datenanalyse verwenden.

library("dplyr") 
my_db <- src_postgres(dbname = "database-name", 
         host = "localhost", 
         port = 5432, 
         user = "username", 
         password = "password") 

df <- tbl(my_db, "my_table") 
df %>% filter(batch_name == "batch_A_1") 

Mit DBI und RPostgreSQL

den Tisch durch das Senden SQL-Abfrage

library("DBI") 
library("RPostgreSQL") 
m <- dbDriver("PostgreSQL")  
con <- dbConnect(drv = m, 
       dbname = "database-name", 
       host = "localhost", 
       port = 5432, 
       user = "username", 
       password = "password")  
df <- dbGetQuery(con, "SELECT * FROM my_table WHERE batch_name %LIKE% 'batch_A_%'") 

library("dplyr") 
df %>% filter(batch_name == "batch_A_1") 
+0

Können Sie dies bearbeiten, um die Tatsache widerzuspiegeln, dass ich die reguläre Ausdrucksfunktion von SQL verwenden wollte? Ihr erster Code-Abschnitt ist falsch, da er einen expliziten Batch-Namen verwendet. Der zweite Codeabschnitt ist gut, weil er eine explizite where-Anweisung in der Abfrage verwendet (was ich vergessen habe), aber er verwendet immer noch einen expliziten Batch-Namen. –

+0

fehlte FROM-Klausel für Tabellenname. Sie können es durch den Namen einer der Tabellen in Ihrer Datenbank ersetzen – Sathish

+0

Der erste Code erhält die gesamte Tabelle 'my_table'. Dann wird der Befehl dplyr library für die Ergebnisse der Datenbankabfrage – Sathish

Verwandte Themen