Использование dplyr в локальных и удаленных базах данных

Я пытаюсь понять, как использовать 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()

Это один из примеров, но я заметил аналогичную ошибку при попытке использовать даты POSIXct и другие функции из небазового R.

Мой вопрос: ограничен ли я использованием только самых простых агрегирующих функций, таких как упомянутые здесь? Если нет, как реализовать другие функции (пользовательские, дополнительные библиотеки и т. Д.) Через dplyr в удаленных базах данных?


person Nancy    schedule 04.02.2016    source источник
comment
Я думаю, что ваше предположение верно - dplyr позволяет писать код R, который автоматически переводится в SQL. Цель dplyr не в том, чтобы заменять каждую функцию SQL функцией R: это было бы сложно и чревато ошибками. Вместо этого dplyr генерирует только операторы SELECT, SQL, который вы пишете чаще всего как аналитик. - cran.r-project.org/web/packages/dplyr/vignettes/databases.html   -  person thelatemail    schedule 04.02.2016
comment
Я думаю, вы можете выполнять все функции postgres. Переходя к вашему примеру с paste0, postgres не имеет paste0 (afaik), но у него есть ||, поэтому вы можете использовать mutate (xy = x% ||% y) `, чтобы получить конкатенацию строк. На странице? Translate_sql упоминается этот пример.   -  person TJ Mahr    schedule 04.02.2016


Ответы (1)


да, dplyr использует пакет dbplyr для переводов SQL. В нем мы должны вручную указать, как каждая команда R преобразуется в этот конкретный синтаксис SQL, поэтому в некоторых случаях одна функция может работать для одной базы данных, а не для других. Я только что проверил перевод для PostgreSQL, и похоже, что у нас есть перевод для paste(), но не для paste0(). Между тем, вы также можете передавать команды SQL внутри dplyr глаголов, например, mutate(m = strpos(field1, "search")) запустит PostgreSQL strpos, который используется для поиска строки в поле.

person edgararuiz    schedule 04.10.2017