2016-10-10 29 views
0

我想使用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.

+0

嘗試刪除並重新創建你的'sqlite'數據庫。它看起來已經成功了。 –

+0

仍然失敗。沒有表格x。只有虹膜和汽車。這就是爲什麼我認爲這是一個NSE問題。 – jsta

回答

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]]" 

nameSQLite源表是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

相關問題