• R语言
  • tbl()从数据库里读取的数据集,很多处理函数比如 complete 不支持呢

从本地数据库读取了mtcars数据集, 因为想一些处理, 然后转换一下sql语句, 看看sql是怎么写的.

df <- tbl (con, 'mtcars')
一些简单的函数可以生成sql

df %>% show_query()
<SQL>
SELECT *
FROM `mtcars`

有很多函数类似complete就不支持呢了

df%>% complete(hp,cyl)

Error in `sql_query_join()`:
! MySQL does not support full joins
Backtrace:
  1. base (local) `<fn>`(x)
  2. print.tbl_sql(x)
  3. overridePrint(o$x, o$options, o$className, o$nRow, o$nCol)
  5. dbplyr:::as.data.frame.tbl_sql(head(x, max.print))
  8. dbplyr:::collect.tbl_sql(x, n = n)
     ...
 25. dbplyr:::sql_render.join_query(...)
 26. dbplyr:::dbplyr_query_join(...)
 27. dbplyr:::dbplyr_fallback(con, "sql_join", ..., lvl = lvl)
 29. dbplyr:::sql_join.DBIConnection(con, ...)
 31. dbplyr:::sql_query_join.MariaDBConnection(con, x, y, vars, type = type, by = by, na_matches = na_matches, ..., lvl = lvl)

有没有什么方法既能让数据集支持complete补全, 又能show_query()转为sql呢

tidyr::complete依赖于dplyr::full_join,而MySQL不支持 full join。你也许可以考虑使用left join,right join和union等的组合来等价实现full join的功能。

    fenguoerbian 感谢回复
    发现 dbplyr包里, memdb_frame手动创建一个临时数据集可以这么生成

    db <- memdb_frame(name = c('ana','eva','eva'),month = c(1, 1, 2))
    db %>% complete(name,month ) %>% show_query()

    但是自由数据集没法这么操作转换