数据库
首页 > 数据库> > mysql-用于分组的mutate操作的dbplyr窗口函数

mysql-用于分组的mutate操作的dbplyr窗口函数

作者:互联网

我想使用dbplyr / dplyr创建一个组级别的聚合变量.这是命令的要点:

q = tbl_copy %>% 
  group_by(group_var) %>%
  mutate(x_agg = min(x))

但这会产生以下错误:
错误:此数据库不支持窗口函数`min()`

奇怪的是,当我使用summarise()动词时,min()可以正常工作.

q = tbl_copy %>% 
  group_by(group_var) %>%
  summarise(x_agg = min(x))

q %>% show_query()
<SQL>
SELECT `group_var`, `x`, MIN(`x`) AS `x_agg`
FROM `my_table`
GROUP BY `group_var`

我想念什么?如何在MySQL表的副本上使用group_by()和mutate()?

更新:一个可复制的示例

> con <- DBI::dbConnect(RSQLite::SQLite(), ":memory:")
> copy_to(con, mtcars)
> 
> mtcars2 <- tbl(con, "mtcars")
> mtcars2 %>%
+     select(mpg,cyl) %>%
+     group_by(cyl) %>%
+     mutate(mpg_min = min(mpg))
Error: Window function `min()` is not supported by this database

解决方法:

MySQL不支持窗口函数,这就是dbplyr无法将dplyr代码转换为SQL的原因.

当您使用MySQL数据库时,通常的解决方法是使用嵌套SQL查询,例如:

select yt.*, t.x_agg
from yourtable yt inner join (select group_var, min(x) as x_agg 
                              from yt 
                              group by group_var) t 
                    on yt.group_var = t.group_var

您可以使用dbGetQuery将上述查询直接发送到MySQL,或将此策略转换为dplyr代码:

tbl_copy %>% 
  inner_join(tbl_copy %>% 
               group_by(group_var) %>%
               summarise(x_agg = min(x)), by = "group_var")

还要注意,如果您的表足够小,则更直接的方法是在内存中完成所有操作(我的意思是:在客户端,即在R中).

标签:dplyr,dbplyr,mysql,r
来源: https://codeday.me/bug/20191111/2018031.html