一尘不染

使用 dbplyr 删除包含 NA 行

sql

这是我如何通过 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 查询。

提前致谢。


阅读 265

收藏
2021-05-30

共1个答案

一尘不染

好吧,实际上我仍然没有得到令人满意的解决方案。我真正想做的是在 R 环境中删除包含 NA 行而不键入 SQL 查询,我认为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))

是的,我知道它看起来并不神奇,但也许有人可以利用它。

2021-05-30