【问题标题】:Using dplyr on local vs remote databases在本地与远程数据库上使用 dplyr
【发布时间】:2016-02-04 02:40:30
【问题描述】:

我试图了解如何在远程数据库上使用 dplyr 与存储在 R 中的数据。也就是说,我不清楚 mutate() 可以使用哪些功能。例如,这很好用:

diamonds %>%
    select(color, cut, price) %>%
    mutate(
        newcol = paste0(cut, color)
)

但是,如果我尝试在远程数据库上使用paste()(太大而无法在本地存储),我会收到一条错误消息

Error in postgresqlExecStatement(conn, statement, ...) : 
  RS-DBI driver: (could not Retrieve the result : ERROR:  function paste0()

这是一个例子,但我在尝试使用非基础 R 中的 POSIXct 日期和其他函数时发现了一个类似的错误。

我的问题:我是否仅限于使用here 中提到的非常基本的聚合函数?如果没有,如何通过 dplyr 在远程数据库上实现其他功能(自定义、附加库等)?

【问题讨论】:

  • 我认为您的假设是正确的 - "dplyr 允许您编写自动转换为 SQL 的 R 代码。dplyr 的目标不是用 R 函数替换每个 SQL 函数:即会很困难并且容易出错。相反,dplyr 只生成 SELECT 语句,这是您作为分析师最常编写的 SQL。" - cran.r-project.org/web/packages/dplyr/vignettes/databases.html
  • 我认为你可以完成所有的 postgres 功能。以 paste0 为例,postgres 没有 paste0 (afaik),但它确实有 || 所以你可以使用 mutate(xy = x %||% y)` 来获得字符串连接。 ?translate_sql 页面提到了这个例子。

标签: r dplyr dbplyr


【解决方案1】:

是的,dplyr 使用 dbplyr 包进行 SQL 转换。在其中,我们必须手动指定每个 R 命令如何转换为特定的 SQL 语法,因此在某些情况下,一个函数可能适用于一个数据库,而不适用于其他数据库。我刚刚检查了 PostgreSQL 的翻译,看起来我们有 paste() 的翻译,但没有 paste0()。同时,您还可以在dplyr 动词中传递SQL 命令,例如mutate(m = strpos(field1, "search")) 将运行PostgreSQL 的strpos,用于在字段中定位字符串。

【讨论】:

    猜你喜欢
    • 2019-10-22
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 2011-10-17
    • 2014-03-30
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多