【问题标题】:How to use outside packages inside R dbplyr mutate如何在 R dbplyr mutate 中使用外部包
【发布时间】:2018-03-23 17:08:43
【问题描述】:

我目前正在使用以下方法通过 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

【问题讨论】:

  • 您必须了解,您在 dbplyr 链中的 mutate 调用中使用的每个函数都具有对 SQL 的即席转换,或者被尝试作为 SQL 函数,因此您不能使用那里的另一个包中的代码,除非你当然首先使用collect
  • 我认为 as.Date 已翻译,因此您可以使用它,但我相信 excel 日期的零与 R 日期不同,因此您可能需要添加或减去一个常数。改造前。
  • @Moody_Mudskipper 感谢您的快速响应。当我尝试使用 as.Date 时收到错误消息:从字符串转换日期和/或时间时转换失败。因此,如果我必须坚持收集,那么我是否只需将输出转换为数据框(例如),然后在列上正常使用我的函数?
  • 先尝试转换为数字,我没有看到您的列是字符。 as.Date(as.numeric(nbDate)+whatever_constant_is_needed)
  • 还可以在这里查看接受的答案,它可能用于格式化日期:stackoverflow.com/questions/47438567/…

标签: r dbplyr


【解决方案1】:

主要的是,在 MS SQL 中,此转换首先需要转换为 datetime,然后转换为 date。由于在dbplyr 中目前没有强制转换为datetime 的函数,因此最好使用sql() 来传递MS SQL 命令。这样,您可以保留所有进程服务器端,并避免将数据collect()ing 到 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
 )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2015-04-01
    • 2021-06-03
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多