sql - 使用 dbplyr 删除包含 NA 行
问题描述
这是我通过 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 查询。
提前致谢。
解决方案
尝试使用!is.na(col_name)
作为过滤器的一部分:
library(dplyr)
library(dbplyr)
df = data.frame(my_num = c(1,2,3))
df = tbl_lazy(df, con = simulate_mssql())
output = df %>% filter(!is.na(my_num))
调用show_query(output)
检查生成的 sql 给出:
<SQL>
SELECT *
FROM `df`
WHERE (NOT(((`my_num`) IS NULL)))
额外的括号是 dbplyr 如何进行翻译的一部分。
如果要对多个列执行此操作,请根据此答案尝试以下方法:
library(rlang)
library(dplyr)
library(dbplyr)
df = data.frame(c1 = c(1,2,3), c2 = c(9,8,7))
df = tbl_lazy(df, con = simulate_mssql())
colnames = c("c1","c2")
conditions = paste0("!is.na(",colnames,")")
output = df %>%
filter(!!!parse_exprs(conditions))
调用show_query(output)
显示两列都出现在生成的查询中:
<SQL>
SELECT *
FROM `df`
WHERE ((NOT(((`c1`) IS NULL))) AND (NOT(((`c2`) IS NULL))))
推荐阅读
- c# - c# Parallel.Invoke vs Parallel.ForEach - 处理数据源并并行修改
- pentaho - Domino 服务器拒绝连接
- python - 通过 Alembic SceneGraph 重命名 ReadGeo 节点
- php - Wordpress - 如何获取下一个新帖子 ID
- php - 通过 AJAX 和 PHP 提交表单
- r - 总结为“R”
- amazon-s3 - Google Action - 使用 Amazon Polly 将文本合成为语音
- android - Ionic - 没有 firebase 或类似的推送通知
- python - python中的安全属性分配
- javascript - socket_bind()函数中的端口参数可以是80还是443?