我未能找到解决这一任务的办法:
对于简单的情况,可以使用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中的错误(“转义”):没有适用于类c(‘tbl_PostgreSQLConnection’、'tbl_dbi‘、'tbl_sql’、'tbl_lazy‘、’tbl‘)对象的“转义”方法。
我知道如何使用SQL语法执行此操作:
从mtcar中选择*,(dense_rank over(按齿轮订购)为gi;
但我想用dplyr语法还是..。如何在dbSendQuery类中直接使用tbl_dbi?
提前感谢
发布于 2019-09-08 01:13:16
作为@akrun注释,并不是所有函数都会翻译。但是,在某些情况下,这可能对您有好处。
下面是一种在整洁的诗句中使用dense_rank函数的方法:
approach1 = mtcars2 %>%
mutate(combined_index = paste0(gear, carb)) %>%
mutate(gi = dense_rank(combined_index))我确信paste0和dense_rank都会通过dbplyr转换成PostgreSQL,但是不能在当前的环境中进行测试。
或者,您可以利用这样一个事实,即当dbplyr无法翻译命令时,它会保持原样。这意味着您可以将一些PostgreSQL命令直接写入您的R.下面是一种使用此思想的方法:
approach2 = mtcars2 %>%
mutate(
gi = sql("DENSE_RANK() OVER(ORDER BY gear, carb)")
)这样做的想法是,由于dbplyr没有DENSE_RANK的转换,所以它将按照原样将其传递给DENSE_RANK命令。这种方法的缺点是您无法将代码轻松地传输到没有PostgreSQL的环境中。
在执行这两种方法之前,您可以通过检查它们是否生成正确的SQL语法来测试它们是否工作,如下所示:
approach1 %>% show_query()
approach2 %>% show_query()https://stackoverflow.com/questions/57827182
复制相似问题