Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R dbplyr mutate中使用外部包_R_Dbplyr - Fatal编程技术网

如何在R dbplyr mutate中使用外部包

如何在R dbplyr mutate中使用外部包,r,dbplyr,R,Dbplyr,我目前正在使用dbplyr拉入一个数据集,使用以下方法: connectInfo <- dbConnect( odbc(), Driver = "SQL Server", Server = "myServerName", Database = "myDatabaseName", Trusted_Connection = "True" ) tbl(connectInfo, "tableName") %>% summarise( nbDate = LEF

我目前正在使用dbplyr拉入一个数据集,使用以下方法:

connectInfo <- dbConnect(
  odbc(),
  Driver = "SQL Server",
  Server = "myServerName",
  Database = "myDatabaseName",
  Trusted_Connection = "True"
)

tbl(connectInfo, "tableName") %>%
  summarise(
    nbDate = LEFT(nbDate, 5),
    book,
    rateFeeChg
  ) %>%
  mutate(
    rateFeeChg = rateFeeChg * 100
  )
我收到以下错误:

Error in janitor::excel_numeric_to_date(nbDate) : 
  object 'nbDate' not found

主要的是,在MS SQL中,这种转换首先需要转换为
datetime
,然后转换为
date
。由于在
dbplyr
中,目前没有强制执行
datetime
的函数,因此最好使用
sql()
传递MS sql命令。这样,您就可以保留所有进程服务器端,并避免
collect()
R内存中的数据。SQL中的默认
datetime
转换似乎与Excel具有相同的基准日期,因此您应该返回相同的日期。以下是我刚刚在我的系统上测试的一个建议解决方案:

tbl(connectInfo, "tableName") %>%
   summarise(
   nbDate = sql("CAST(LEFT(nbDate, 5) as datetime)"),
   book,
   rateFeeChg
 ) %>%
 mutate(
  nbDate = as.Date(nbDate),
  rateFeeChg = rateFeeChg * 100
 )

您必须了解,在
dbplyr
链中的mutate调用中使用的每个函数都有一个到SQL的临时转换,或者作为SQL函数进行尝试,因此您不能使用另一个包中的代码,当然,除非您首先使用
collect
。我认为
as.Date
被转换,所以你可以使用它,但我相信excel日期的零和R日期不同,所以你可能需要加或减一个常数。在转换之前,感谢您的快速响应。当我尝试使用as.Date时,我收到错误:从字符串转换日期和/或时间时转换失败。因此,如果我必须坚持使用collect,那么我会将输出转换为数据帧(例如),然后像往常一样对列使用我的函数吗?首先尝试转换为数值,我没有看到您的列是字符
as.Date(as.numeric(nbDate)+所需的任何常数)
再看看这里接受的答案,它可能用于格式化日期:
Error in janitor::excel_numeric_to_date(nbDate) : 
  object 'nbDate' not found
tbl(connectInfo, "tableName") %>%
   summarise(
   nbDate = sql("CAST(LEFT(nbDate, 5) as datetime)"),
   book,
   rateFeeChg
 ) %>%
 mutate(
  nbDate = as.Date(nbDate),
  rateFeeChg = rateFeeChg * 100
 )