Mysql 分组变异操作的dbplyr窗口函数
我想使用dbplyr/dplyr创建一个组级聚合变量。以下是命令的要点:Mysql 分组变异操作的dbplyr窗口函数,mysql,r,dplyr,dbplyr,Mysql,R,Dplyr,Dbplyr,我想使用dbplyr/dplyr创建一个组级聚合变量。以下是命令的要点: q = tbl_copy %>% group_by(group_var) %>% mutate(x_agg = min(x)) 但这会产生以下错误: 错误:此数据库不支持窗口函数'min' 奇怪的是,当我使用summary动词时,min的效果很好 q = tbl_copy %>% group_by(group_var) %>% summarise(x_agg = min(x))
q = tbl_copy %>%
group_by(group_var) %>%
mutate(x_agg = min(x))
但这会产生以下错误:
错误:此数据库不支持窗口函数'min'
奇怪的是,当我使用summary动词时,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不支持窗口函数,这就是dbplyr无法将dplyr代码转换为SQL的原因 当您使用MySQL DB时,通常的解决方法是使用嵌套SQL查询,例如: 选择yt.*,t.x_agg 从yt INTERNAL join表中选择group_var,minx as x_agg 来自yt 分组 关于yt.group\u var=t.group\u var 您可以使用dbGetQuery将上述查询直接发送到MySQL,也可以将此策略转换为dplyr代码: tbl_副本%>% 内接缝BL\U副本%>% 按组分组变量%>% SummarySex\u agg=minx,by=group\u var
另外请注意,如果您的表足够小,更直接的方法是在内存中执行所有操作,我的意思是:在客户端,即在R中。是的,我明白了。期望dplyr以编程方式在SQL翻译中编写这些子查询是否合理?我确实进行了很多分组变异,我希望避免用一堆left_join语句重新编写dplyr代码。有点违背了使用dplyr代替关系数据库的许多目的。我同意如果dplyr能够解决这个问题就好了!但我不知道我们是否应该期待它。。。无论如何,在某种程度上,您总是需要编写仔细优化的SQL查询,我不认为这可以通过另一种语言的自动翻译来实现,特别是考虑到每个DBMS都有自己的SQL实现。
> 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