Вызовите R Dataframe в SQL - PullRequest
       26

Вызовите R Dataframe в SQL

0 голосов
/ 04 декабря 2018

есть ли способ вызвать R-фрейм данных в SQL?Например, я хотел бы запустить что-то вроде:

SELECT user_id, other_variables FROM table1 WHERE user_id IN ('R DATAFRAME')

, где R-кадр данных - это простой список некоторых идентификаторов пользователей, которые можно найти в таблице1.

Мне просто интересно, возможно ли что-то подобное, написанное на R или SQL, и если да, то как это сделать?Я знаю, что могу просто загрузить фрейм данных R в базу данных, но у меня нет прав для создания собственных таблиц в базе данных.Любая помощь будет принята с благодарностью, спасибо.

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Вот ответ для почти полного использования датафрейма, строка за строкой.

library(dplyr)
library(RSQLite)
library(DBI)
library(glue)
# Only for data example
con <- dbConnect(RSQLite::SQLite(), ":memory:")
T_all<- data.frame(a=1:3,b=c("a","b","c"))
T_where <- data.frame(a=1:3,b=c("a","b","d"))
DBI::dbWriteTable(con, "T_all", T_all)
DBI::dbWriteTable(con, "T_where", T_where)

# The function of the answer
glue_sql.multi.fct <-function (sql_multi_vars, args,connexion_bdd=DBI::ANSI()) {
  args<-unlist(list(sql_multi_vars,args,.con =connexion_bdd), recursive = FALSE ) 
  unname(names(args)[1])# for 1st arg of glue_sql()
  do.call(glue_sql,args )
}

# All datas where I find 
dfall<-DBI::dbGetQuery(con,"select * from T_All")
print("dfall: All datas where I find ")
print(dfall)

dfw<-DBI::dbGetQuery(con,"select * from T_Where")

sql1="select * from T_all where a = {a} and b={b}"


sql_binded<-glue_sql.multi.fct(sql1,list(a=1,b="a"))
print("sql_binded")
print(sql_binded)
dfall_filtered1<-DBI::dbGetQuery(con,sql_binded)
print("dfall_filtered1: datas dfall filtered by a list (normal use of glue_sql()")
print(dfall_filtered1)

# loop for the datas dfall filtered by dfw
dfall_filtered2<-  data.frame()   
# the loop is mandatory for SQL Server, it doesn't work like example of multi line of DBI::dbGetQuery documentation.
for (sqlcurrent in glue_sql.multi.fct(sql1,dfw))  {
  dfall_filtered2<-rbind(dfall_filtered2, DBI::dbGetQuery(con,sqlcurrent))
  print(sqlcurrent)
}

# results of  the datas dfall filtered by dfw
print("dfall_filtered2: results of  the datas dfall filtered by dfw")
print(dfall_filtered2)

dbDisconnect(con)

Ouput

[1] "dfall: All datas where I find "
  a b
1 1 a
2 2 b
3 3 c
[1] "sql_binded"
<SQL> select * from T_all where a = 1 and b='a'
[1] "dfall_filtered1: datas dfall filtered by a list (normal use of glue_sql()"
  a b
1 1 a
[1] "select * from T_all where a = 1 and b='a'"
[1] "select * from T_all where a = 2 and b='b'"
[1] "select * from T_all where a = 3 and b='d'"
[1] "dfall_filtered2: results of  the datas dfall filtered by dfw"
  a b
1 1 a
2 2 b
0 голосов
/ 05 декабря 2018

За исключением искровой среды или пакета R sqldf вы не можете.

Если это только список идентификаторов, вы можете использовать unlist()

sqlQuery (ch,paste0(" 
  select * from my_table 
  where id in (",
  paste(unlist(my_df_Fktable$id), 
  collapse=','),
  ")"
))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...