我想使用dbplyr
/ dplyr
来创建组级聚合变量。以下是该命令的要点:
q = tbl_copy %>%
group_by(group_var) %>%
mutate(x_agg = min(x))
但这会产生以下错误:
Error: Window function `min()` is not supported by this database
奇怪的是,当我使用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
答案 0 :(得分:3)
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中)。