首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dplyr & postgresql group_indices

dplyr & postgresql group_indices
EN

Stack Overflow用户
提问于 2019-09-06 18:46:16
回答 1查看 156关注 0票数 1

我未能找到解决这一任务的办法:

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

代码语言:javascript
复制
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)

任务很简单,每个组都有一个唯一的编号。

所以:

代码语言:javascript
复制
mtcars %>% mutate( gi = group_indices(., gear, carb))

现在我需要同样的DB版本。

代码语言:javascript
复制
mtcars2 %>% mutate( gi = group_indices(., gear, carb))

但我得到了:

UseMethod中的错误(“转义”):没有适用于类c(‘tbl_PostgreSQLConnection’、'tbl_dbi‘、'tbl_sql’、'tbl_lazy‘、’tbl‘)对象的“转义”方法。

我知道如何使用SQL语法执行此操作:

从mtcar中选择*,(dense_rank over(按齿轮订购)为gi;

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

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-08 01:13:16

作为@akrun注释,并不是所有函数都会翻译。但是,在某些情况下,这可能对您有好处。

下面是一种在整洁的诗句中使用dense_rank函数的方法:

代码语言:javascript
复制
approach1 = mtcars2 %>%
  mutate(combined_index = paste0(gear, carb)) %>%
  mutate(gi = dense_rank(combined_index))

我确信paste0dense_rank都会通过dbplyr转换成PostgreSQL,但是不能在当前的环境中进行测试。

或者,您可以利用这样一个事实,即当dbplyr无法翻译命令时,它会保持原样。这意味着您可以将一些PostgreSQL命令直接写入您的R.下面是一种使用此思想的方法:

代码语言:javascript
复制
approach2 = mtcars2 %>%
  mutate(
             gi = sql("DENSE_RANK() OVER(ORDER BY gear, carb)")
        )

这样做的想法是,由于dbplyr没有DENSE_RANK的转换,所以它将按照原样将其传递给DENSE_RANK命令。这种方法的缺点是您无法将代码轻松地传输到没有PostgreSQL的环境中。

在执行这两种方法之前,您可以通过检查它们是否生成正确的SQL语法来测试它们是否工作,如下所示:

代码语言:javascript
复制
approach1 %>% show_query()
approach2 %>% show_query()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57827182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档