这是我如何通过 dbplyr 运行一些 SQL 查询
library(tidyverse) library(dbplyr) library(DBI) library(RPostgres) library(bit64) library(tidyr) drv <- dbDriver('Postgres') con <- dbConnect(drv,dbname='mydb',port=5432,user='postgres') table1 <- tbl(con,'table1') table2 <- tbl(con,'table2') table3 <- tbl(con,'table3') table1 %>% mutate(year=as.integer64(year)) %>% left_join(table2,by=c('id'='id')) %>% left_join(table3,by=c('year'='year'))
我想删除一些包含 NA 的行,然后是collect我的最终表,但找不到任何有用的 dbplyr 查询。
我试图drop_na()从tidyr和其他一些基本功能(complete.cases()等)进行管道传输。你会建议我什么来实现我的目标吗?WHERE FOO IS NOT NULL也欢迎将 SQL 查询(如)传送到 dbplyr 查询。
drop_na()
complete.cases()
提前致谢。
好吧,实际上我仍然没有得到令人满意的解决方案。我真正想做的是在 R 环境中删除包含 NA 行而不键入 SQL 查询,我认为dbplyr还不支持此功能。
dbplyr
然后我写了一些简单的代码来实现我的愿望;
main_query<-table1 %>% mutate(year=as.integer64(year)) %>% left_join(table2,by=c('id'='id')) %>% left_join(table3,by=c('year'='year')) colnames <- main_query %>% colnames query1 <- main_query %>% sql_render %>% paste('WHERE') query2<-'' for(i in colnames){ if(i == tail(colnames,1)){query2<-paste(query2,i,'IS NOT NULL')} else{query2<-paste(query2,i,'IS NOT NULL AND')} } desiredTable <- dbGetQuery(con,paste(query1,query2))
是的,我知道它看起来并不神奇,但也许有人可以利用它。