使用dplyr将data.frame列表复制到sqlite数据库
问题描述:
我想使用dplyr软件包从data.frame列表中创建一个sqlite数据库。它看起来像dplyr::copy_to
函数是我需要使用的。我认为我遇到的问题与NSE有关。另请参阅dplyr
with databases上的小插图。使用dplyr将data.frame列表复制到sqlite数据库
data(iris)
data(cars)
res <- list("iris" = iris, "cars" = cars)
my_db <- dplyr::src_sqlite(paste0(tempdir(), "/foobar.sqlite3"),
create = TRUE)
lapply(res, function(x) dplyr::copy_to(my_db, x))
Error: Table x already exists.
答
这样做的原因是因为默认的表名基于在R.数据帧的名称的当使用lapply
,但它确实不采取索引名。
为dplyr::copy_to.src_sql
的文档中包含:
## S3 method for class 'src_sql'
copy_to(dest, df, name = deparse(substitute(df)),
types = NULL, temporary = TRUE, unique_indexes = NULL, indexes = NULL,
analyze = TRUE, ...)
线name = deparse(substitute(df))
显示了表名的由来。
我们可以看到什么变成:
res <- list("iris" = iris, "cars" = cars)
tmp = lapply(res, function(x) print(deparse(substitute(x))))
#> [1] "X[[i]]"
#> [1] "X[[i]]"
的name
在SQLite
源表是X[[i]]
;一旦第一行被执行,该表就已经存在。
我们可以通过使用明确的for
循环和二次传递名称或在索引编号上使用lapply
来解决。
例如:
res <- list("iris" = iris, "cars" = cars)
my_db <- dplyr::src_sqlite(paste0(tempdir(), "/foobar.sqlite3"),
create = TRUE)
lapply(seq_along(res), function(i, l){dplyr::copy_to(my_db, l[[i]], names(l)[[i]])}, l = res)
my_db %>% tbl("iris") %>% head
#> Source: query [?? x 5]
#> Database: sqlite 3.8.6
#>
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> <dbl> <dbl> <dbl> <dbl> <chr>
#> 1 5.1 3.5 1.4 0.2 setosa
#> 2 4.9 3.0 1.4 0.2 setosa
#> 3 4.7 3.2 1.3 0.2 setosa
#> 4 4.6 3.1 1.5 0.2 setosa
#> 5 5.0 3.6 1.4 0.2 setosa
#> 6 5.4 3.9 1.7 0.4 setosa
my_db %>% tbl("cars") %>% head
#> Source: query [?? x 2]
#> Database: sqlite 3.8.6
#>
#> speed dist
#> <dbl> <dbl>
#> 1 4 2
#> 2 4 10
#> 3 7 4
#> 4 7 22
#> 5 8 16
#> 6 9 10
+1
我发现这个格式更容易阅读:'lapply(seq_along(res),function(i,dt = res)dplyr :: copy_to(my_db,dt [[i]],names(dt)[[i]])) ' – jsta
尝试删除并重新创建你的'sqlite'数据库。它看起来已经成功了。 –
仍然失败。没有表格x。只有虹膜和汽车。这就是为什么我认为这是一个NSE问题。 – jsta