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

时间:2018-03-23 17:08:44

标签: r dbplyr

我目前正在使用以下内容使用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
  )

使用以下输出:

   nbDate    book rateFeeChg
    <chr>   <chr>      <dbl>
 1  38348 Classic  0.0000000
 2  38744 Classic  2.1270990
 3  39640 Classic  2.8999999
 4  40423 Classic  0.0000000
# ... with more rows

我想要做的是将这5位数日期值转换为mutate函数内的常规日期值。 我知道通过使用janitor库我可以很容易地转换它,但是当我尝试放置

mutate(
    rateFeeChg = rateFeeChg * 100,
    nbDate = janitor::excel_numeric_to_date(nbDate)
)

我收到以下错误:

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

1 个答案:

答案 0 :(得分:0)

最主要的是,在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
 )