dplyr';s mutate函数是否与数据库一起工作?

dplyr';s mutate函数是否与数据库一起工作?,r,dplyr,rsqlite,tidyverse,R,Dplyr,Rsqlite,Tidyverse,我尝试在类似SQL的数据库上使用dplyr的mutate()函数。我不明白为什么它有时起作用,有时却不起作用 这里有一个例子,是来自 将数据加载到数据库中 但是使用paste0() 如果我尝试使用基函数paste0()创建一个新变量,则会出现错误 > tbl(db_sqlite, "flights") %>% mutate(date = paste0(year, month, day)) Source: query [?? x 20] Database: sqlite 3.8.6

我尝试在类似SQL的数据库上使用dplyr的
mutate()
函数。我不明白为什么它有时起作用,有时却不起作用

这里有一个例子,是来自

将数据加载到数据库中 但是使用
paste0()
如果我尝试使用基函数
paste0()
创建一个新变量,则会出现错误

> tbl(db_sqlite, "flights") %>% mutate(date = paste0(year, month, day))
Source:   query [?? x 20]
Database: sqlite 3.8.6 [data/my_db.sqlite3]

Error in sqliteSendQuery(conn, statement) : 
  error in statement: no such function: PASTE0
会议信息如下:

> devtools::session_info()
Session info ------------------------------------------------------------------------------------------------
 setting  value                       
 version  R version 3.3.2 (2016-10-31)
 system   x86_64, linux-gnu           
 ui       RStudio (1.0.35)            
 language (EN)                        
 collate  C                           
 tz       <NA>                        
 date     2016-12-12                  

Packages ----------------------------------------------------------------------------------------------------
 package      * version    date       source                          
 DBI            0.5-1      2016-09-10 cran (@0.5-1)                   
 R6             2.2.0      2016-10-05 cran (@2.2.0)                   
 RSQLite        1.0.0      2014-10-25 CRAN (R 3.2.2)                  
 Rcpp           0.12.8     2016-11-17 cran (@0.12.8)                  
 assertthat     0.1        2013-12-06 CRAN (R 3.2.2)                  
 devtools       1.12.0     2016-06-24 CRAN (R 3.3.1)                  
 digest         0.6.10     2016-08-02 CRAN (R 3.2.3)                  
 dplyr        * 0.5.0.9000 2016-12-12 Github (hadley/dplyr@c846cb3)   
 lazyeval       0.2.0.9000 2016-10-14 Github (hadley/lazyeval@c155c3d)
 magrittr       1.5        2014-11-22 CRAN (R 3.2.3)                  
 memoise        1.0.0      2016-01-29 CRAN (R 3.2.3)                  
 nycflights13 * 0.2.0      2016-04-30 CRAN (R 3.3.2)                  
 tibble         1.2        2016-08-26 CRAN (R 3.2.3)                  
 withr          1.0.2      2016-06-20 CRAN (R 3.2.3)               
devtools::session_info() 会话信息------------------------------------------------------------------------------------------------ 设定值 R版3.3.2版(2016-10-31) 系统x86_64,linux gnu 用户界面RStudio(1.0.35) 语言(英文) 校对C 茨 日期2016-12-12 包裹---------------------------------------------------------------------------------------------------- 包*版本日期源 DBI 0.5-1 2016-09-10克朗(@0.5-1) R6 2.2.0 2016-10-05起重机(@2.2.0) RSQLite 1.0.0 2014-10-25起重机(R 3.2.2) Rcpp 0.12.8 2016-11-17起重机(@0.12.8) 资产负债表0.1 2013-12-06起重机(R 3.2.2) 开发工具1.12.0 2016-06-24起重机(R 3.3.1) 摘要0.6.10 2016-08-02起重机(R 3.2.3) dplyr*0.5.0.9000 2016-12-12 Github(哈德利)/dplyr@c846cb3) lazyeval 0.2.0.9000 2016-10-14 Github(哈德利)/lazyeval@c155c3d) magrittr 1.5 2014-11-22起重机(R 3.2.3) 备忘录1.0.0 2016-01-29克兰(R 3.2.3) nycflights13*0.2.0 2016-04-30起重机(R 3.3.2) tibble 1.2 2016-08-26起重机(R 3.2.3) 带R 1.0.2 2016-06-20起重机(R 3.2.3) 在数据库上使用
mutate()
可以执行哪些操作


是否有任何解决方案可以在数据库上使用函数,如
paste0()
,而不将数据收集到内存中?

好的,感谢@michael griffiths的评论,答案是:不能保证R函数可以转换为sql代码

因此,如果返回错误,我们可以尝试使用sql()函数直接编写sql代码


注意,这取决于数据库(sqlite、postgre、mysql或mariadb等)

我认为这就是
collect()
方法的作用

tbl(db_sqlite,“航班”)%%
收集()%>%
突变(日期=粘贴0(年、月、日))

collect()
将数据检索到本地TIBLE中,然后可以对其应用R函数


我没有执行上面的代码

是的,这是因为
paste0
在SQLite中没有相应的翻译。在
dbplyr
中,我们通常可以使用
CONCATENATE
SQL命令来等同于
paste0
完成的操作。此命令应适用于不同的SQL后端。例如,
min()
max()
是不适用于SQLite,但适用于其他数据库的其他命令


关于评估,当您将
dplyr
代码等同于一个变量时,即:
db_var%mutate(x=x+1)
将不会进行评估,直到您对其执行某些操作,例如请求打印结果,这是通过传递
db_var
或传递
collect()来完成的
命令。

dplyr
将某些函数转换为SQL,或者,如果函数不存在,则将函数名传递给SQL。您可以改为做一些类似于
tbl(db|u sqlite,“flights”)%%>%mutate(date=sql(“year | | month | | | day”)
dbplyr
的操作,应该能够处理这个问题,尽管我需要使用
paste0(paste0(var1,var2,var3)
使它在连接到Oracle时工作。
> tbl(db_sqlite, "flights") %>% mutate(date = paste0(year, month, day))
Source:   query [?? x 20]
Database: sqlite 3.8.6 [data/my_db.sqlite3]

Error in sqliteSendQuery(conn, statement) : 
  error in statement: no such function: PASTE0
> devtools::session_info()
Session info ------------------------------------------------------------------------------------------------
 setting  value                       
 version  R version 3.3.2 (2016-10-31)
 system   x86_64, linux-gnu           
 ui       RStudio (1.0.35)            
 language (EN)                        
 collate  C                           
 tz       <NA>                        
 date     2016-12-12                  

Packages ----------------------------------------------------------------------------------------------------
 package      * version    date       source                          
 DBI            0.5-1      2016-09-10 cran (@0.5-1)                   
 R6             2.2.0      2016-10-05 cran (@2.2.0)                   
 RSQLite        1.0.0      2014-10-25 CRAN (R 3.2.2)                  
 Rcpp           0.12.8     2016-11-17 cran (@0.12.8)                  
 assertthat     0.1        2013-12-06 CRAN (R 3.2.2)                  
 devtools       1.12.0     2016-06-24 CRAN (R 3.3.1)                  
 digest         0.6.10     2016-08-02 CRAN (R 3.2.3)                  
 dplyr        * 0.5.0.9000 2016-12-12 Github (hadley/dplyr@c846cb3)   
 lazyeval       0.2.0.9000 2016-10-14 Github (hadley/lazyeval@c155c3d)
 magrittr       1.5        2014-11-22 CRAN (R 3.2.3)                  
 memoise        1.0.0      2016-01-29 CRAN (R 3.2.3)                  
 nycflights13 * 0.2.0      2016-04-30 CRAN (R 3.3.2)                  
 tibble         1.2        2016-08-26 CRAN (R 3.2.3)                  
 withr          1.0.2      2016-06-20 CRAN (R 3.2.3)