如何在R的dbplyr mutate中使用外部包?日期转换报错求助
解决dbplyr中Excel数字日期转换的报错问题
嘿,这个报错我太熟了!问题出在dbplyr的运行逻辑上:你写的dplyr代码其实会被翻译成SQL语句直接在数据库里执行,但janitor::excel_numeric_to_date()是纯R本地函数,数据库根本不认识它,自然会提示找不到nbDate对象。
给你两个实用的解决方案,按需选择:
方案1:拉取数据到本地后处理(适合小数据集)
先把数据库里的数据用collect()拉到R的本地环境,之后再用janitor的函数转换——这时候数据已经在R里了,就能正常调用本地函数了。注意要先把字符型的nbDate转成数值型:
tbl(connectInfo, "tableName") %>% summarise( nbDate = LEFT(nbDate, 5), book, rateFeeChg ) %>% mutate( rateFeeChg = rateFeeChg * 100 ) %>% collect() %>% # 关键一步:把数据从数据库拉到R本地 mutate( nbDate = janitor::excel_numeric_to_date(as.numeric(nbDate)) )
方案2:直接在数据库端转换(适合大数据集,效率更高)
如果数据量很大,拉到本地太慢,不如直接用数据库支持的SQL函数来转换Excel日期。Excel的数字日期是以1900-01-01为起点的天数(注意Excel有个1900闰年的bug,SQL Server不承认,所以要减2修正)。用dbplyr的sql()函数嵌入SQL代码就行:
tbl(connectInfo, "tableName") %>% mutate( # 把前5位字符转成整数,再用DATEADD计算日期 nbDate = sql("DATEADD(day, CAST(LEFT(nbDate, 5) AS INT) - 2, '1900-01-01')"), rateFeeChg = rateFeeChg * 100 ) %>% select(nbDate, book, rateFeeChg)
简单总结:小数据用方案1省心,大数据用方案2更高效~
内容的提问来源于stack exchange,提问作者jadki
相关产品推荐
相关产品推荐

