按一个变量排序,按另一个分组,然后在 R 中的 SQL Query 中选择第一行
Posted
技术标签:
【中文标题】按一个变量排序,按另一个分组,然后在 R 中的 SQL Query 中选择第一行【英文标题】:Sort by one variable, group by another, and select first row in SQL Query in R 【发布时间】:2021-12-07 22:35:09 【问题描述】:我需要在 SQL 中应用一个从 R 开始对我来说很容易的过程,但在 SQL 中确实很曲折。
我需要将数据按两个变量从高到低排序,根据另一个变量分组,然后选择每个组中的第一项。
我留下了我试图从 R 传递到 SQL 的代码。不幸的是,在尝试将一种语言转换为另一种语言时,dbplyr 包向我抛出了一个错误:错误:first()
仅在窗口化 (mutate()
) 上下文中可用
library(tidyverse)
library(dbplyr)
con <- DBI::dbConnect(RSQLite::SQLite(), ":memory:")
copy_to(con, mtcars)
mtcars2 <- tbl(con, "mtcars")
mtcars2
mtcars2 %>%
arrange(-mpg,-disp) %>%
group_by(cyl) %>%
summarise(hp = first(hp)) %>%
show_query()
在我看来,DISTINCT ON 功能可以帮助我。
感谢您的帮助。
【问题讨论】:
【参考方案1】:也许是以下?
library(tidyverse)
library(dbplyr)
con <- DBI::dbConnect(RSQLite::SQLite(), ":memory:")
copy_to(con, mtcars)
mtcars2 <- tbl(con, "mtcars")
mtcars2 %>%
arrange(-mpg,-disp) %>%
group_by(cyl) %>%
mutate(hp = first(hp)) %>%
select(cyl, hp) %>%
distinct %>%
show_query
#> <SQL>
#> SELECT DISTINCT `cyl`, FIRST_VALUE(`hp`) OVER (PARTITION BY `cyl` ORDER BY -`mpg`, -`disp`) AS `hp`
#> FROM `mtcars`
#> ORDER BY -`mpg`, -`disp`
见:https://github.com/tidyverse/dbplyr/issues/129
【讨论】:
非常感谢,我正在测试代码(原表很大)。我遵循了您的代码,但在按 cyl 分组后删除了对我来说似乎不必要的 distinct() 函数 我猜你真的需要distinct
,@NicolasRatto! mutate
没有总结,因此会得到很多重复的行!我通过在mtcars
上运行代码确认了这一点。
你说得对,我不知道为什么我认为变异是一个总结。我会回去测试不同的。
当我用我的真实数据测试它时,我得到以下错误:当指定 SELECT DISTINCT 时,ORDER BY 中的项目必须出现在选择列表中
它通过删除最后一行 ORDER BY 代码对我有用。非常感谢您的帮助。以上是关于按一个变量排序,按另一个分组,然后在 R 中的 SQL Query 中选择第一行的主要内容,如果未能解决你的问题,请参考以下文章