【问题标题】:dplyr & postgresql get group_indicesdplyr & postgresql 获取 group_indices
【发布时间】:2020-01-09 15:17:16
【问题描述】:

我未能找到解决此任务的方法:

对于简单的情况,让我们以mtcars 为例,让我们使用相同数据的 PostgreSQL 版本:

library(RPostgreSQL)
library(DBI)
library(tidyverse)

pgdrv <- dbDriver(drvName = "PostgreSQL")
db <-dbConnect(pgdrv,
                     dbname="DBMTCARS",
                     host="127.0.0.1", port=5432,
                     user = 'postgres')
copy_to(db, mtcars)
mtcars2 <- tbl(db, mtcars)

任务很简单,为每个组获取一个唯一编号。
所以:

mtcars %>% mutate( gi = group_indices(., gear, carb))

现在我需要与 DB 版本相同的版本

mtcars2 %>% mutate( gi = group_indices(., gear, carb))

但我得到了:

UseMethod("escape") 中的错误: 没有适用于 'escape' 的方法应用于“c('tbl_PostgreSQLConnection', 'tbl_dbi', 'tbl_sql', 'tbl_lazy', 'tbl')”类的对象

我知道如何使用 SQL 语法:

select *, (dense_rank over(order by gear, carb)) as gi FROM mtcars ;

但我想使用 dplyr 语法或.. 如何在tbl_dbi 类中直接使用dbSendQuery

提前致谢

【问题讨论】:

  • 并非 tidyverse 中的所有函数都适用于数据库
  • 有替代方法吗??
  • 那么我想我需要在tbl_dbi 中使用dbSendQuery

标签: r postgresql dplyr dbplyr


【解决方案1】:

作为@akrun cmets,并非所有函数都可以翻译。但是,在某些情况下,这可以对您有利。

这是在 tidy verse 中使用 dense_rank 函数的方法:

approach1 = mtcars2 %>%
  mutate(combined_index = paste0(gear, carb)) %>%
  mutate(gi = dense_rank(combined_index))

我很确定paste0dense_rank 都会通过dbplyr 转换为PostgreSQL,但无法在我当前的环境中进行测试。

或者,您可以利用dbplyr 无法翻译命令时保持原样的事实。这意味着您可以将一些 PostgreSQL 命令直接写入您的 R 中。这是一种使用这种想法的方法:

approach2 = mtcars2 %>%
  mutate(
             gi = sql("DENSE_RANK() OVER(ORDER BY gear, carb)")
        )

这个想法是因为dbplyr 没有DENSE_RANK 的翻译,它会按原样将其传递给SQL 命令。这种方法的缺点是您无法轻松地将代码转移到没有 PostgreSQL 的环境中。

在执行其中任何一个之前,您可以通过检查它们是否产生正确的 SQL 语法来测试它们是否可以工作,如下所示:

approach1 %>% show_query()
approach2 %>% show_query()

【讨论】:

  • 我尝试了方法2,但出现错误:Error: unexpected symbol in: Error: unexpected symbol in:"approach2 = mtcars2 %&gt;%gi = (DENSE_RANK OVER" 似乎也有?dplyr::dense_rank,但我不明白它是如何工作的。
  • 感谢您的反馈。我已经更新了我的答案,将 sql 函数的使用添加到方法 2 中。我所做的测试表明这将起作用。
  • 非常感谢,这正是我想要的,现在我可能会扩展到其他情况。
猜你喜欢
  • 2018-08-18
  • 2017-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 2016-09-08
相关资源
最近更新 更多