gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:09:36 25 4
gpt4 key购买 nike

我想使用 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 中)。

关于mysql - 用于分组变异操作的 dbplyr 窗口函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45042247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com