如何在R dbplyr mutate中使用外部包
我目前正在使用dbplyr拉入一个数据集,使用以下方法:如何在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
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
)