如何解决如何使用 dplyr 将本地数据导入只读数据库?
WRDS 是一家领先的研究数据提供商,为商界和相关领域的学者和其他研究人员提供研究数据。 WRDS 提供了一个 Postgresql 数据库,但这是一个只读数据库。
对于某些任务,无法将数据写入数据库是非常受限制的。例如,如果我想使用每日股票收益进行事件研究,我需要将我的(相对较小的)本地数据集 events
与 crsp.dsf
合并,后者大约有 18GB 的数据。>
一种选择是使用 crsp.dsf
的副本维护我自己的数据库并将 events
写入该数据库并在那里合并。但我正在寻找一个选项,允许我为此目的使用 WRDS 数据库。遗憾的是,无法使用 copy_to
或 dbWriteTable
,因为 WRDS 数据库是只读的。
解决方法
一种选择是使用类似下面的函数,即使在使用只读连接时也可以使用 SQL 将本地数据帧转换为远程数据帧。
df_to_pg <- function(df,conn) {
collapse <- function(x) paste0("(",paste(x,collapse = ","),")")
names <- paste(DBI::dbQuoteIdentifier(conn,names(df)),")
values <-
df %>%
lapply(DBI::dbQuoteLiteral,conn = conn) %>%
purrr::transpose() %>%
lapply(collapse) %>%
paste(collapse = ",\n")
the_sql <- paste("SELECT * FROM (VALUES",values,") AS t (",names,")")
temp_df_sql <- dplyr::tbl(conn,dplyr::sql(the_sql))
return(temp_df_sql)
}
这是正在使用的函数的说明。函数已在 PostgreSQL 和 SQL Server 上测试过,但不适用于 SQLite(由于缺少以这种方式工作的 VALUES
关键字)。
我相信它应该适用于 MySQL 或 Oracle,因为它们有 VALUES
关键字。
library(dplyr,warn.conflicts = FALSE)
library(DBI)
pg <- dbConnect(RPostgres::Postgres())
events <- tibble(firm_ids = 10000:10024L,date = seq(from = as.Date("2020-03-14"),length = length(firm_ids),by = 1))
events
#> # A tibble: 25 x 2
#> firm_ids date
#> <int> <date>
#> 1 10000 2020-03-14
#> 2 10001 2020-03-15
#> 3 10002 2020-03-16
#> 4 10003 2020-03-17
#> 5 10004 2020-03-18
#> 6 10005 2020-03-19
#> 7 10006 2020-03-20
#> 8 10007 2020-03-21
#> 9 10008 2020-03-22
#> 10 10009 2020-03-23
#> # … with 15 more rows
events_pg <- df_to_pg(events,pg)
events_pg
#> # Source: SQL [?? x 2]
#> # Database: postgres [iangow@/tmp:5432/crsp]
#> firm_ids date
#> <int> <date>
#> 1 10000 2020-03-14
#> 2 10001 2020-03-15
#> 3 10002 2020-03-16
#> 4 10003 2020-03-17
#> 5 10004 2020-03-18
#> 6 10005 2020-03-19
#> 7 10006 2020-03-20
#> 8 10007 2020-03-21
#> 9 10008 2020-03-22
#> 10 10009 2020-03-23
#> # … with more rows
由 reprex package (v1.0.0) 于 2021 年 4 月 1 日创建
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。