【问题标题】:Copy a list of data.frame(s) to sqlite database using dplyr使用 dplyr 将 data.frame(s) 列表复制到 sqlite 数据库
【发布时间】:2016-10-10 17:48:41
【问题描述】:

我想使用 dplyr 包从 data.frame(s) 列表中创建一个 sqlite 数据库。看起来dplyr::copy_to 函数是我需要使用的。我认为我遇到的问题与NSE 有关。另请参阅 dplyr with databases 上的小插图。

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))

错误:表 x 已存在。

【问题讨论】:

  • 尝试删除并重新创建您的 sqlite 数据库。看起来它已经成功了。
  • 仍然失败。没有表 x。只有虹膜和汽车。这就是为什么我认为这是一个 NSE 问题。

标签: r sqlite dplyr


【解决方案1】:

这是因为默认表名基于 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]]"

SQLite 源中表的nameX[[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

【讨论】:

  • 我发现这种格式更容易阅读:lapply(seq_along(res), function(i, dt = res) dplyr::copy_to(my_db, dt[[i]], names(dt)[[i]]))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多