如何从 SQLite 数据库中读取所有表并在 R 中存储为 datasets/variables?
How to read all tables from a SQLite database and store as datasets/variables in R?
我有一个包含许多表的大型 SQLite 数据库。我已经使用 RSQLite 和 DBI 包在 RStudio 中建立了到这个数据库的连接。 (我将这个数据库命名为db
)
library(RSQLite)
library(DBI)
目前我必须读入所有表格并手动为它们分配一个名称。例如:
country <- dbReadTable(db, "country")
date <- dbReadTable(db, "date")
#...and so on
您可以看到,如果您有很多表,这可能是一个非常耗时的过程。
所以我想知道是否可以创建一个新函数或使用现有函数(例如 lapply()
?)来更有效地完成此操作并从根本上加快此过程?
非常感谢任何建议:)
您可以使用 dbListTables()
生成 SQLite 数据库中所有 table 名称的字符向量,并使用 lapply()
将它们高效地导入 R。我会首先检查您是否能够将数据库中的所有 table 导入内存。
下面是一个可重现的例子:
library(RSQLite)
library(DBI)
db <- dbConnect(RSQLite::SQLite(), ":memory:")
dbWriteTable(db, "mtcars", mtcars)
dbWriteTable(db, "iris", iris)
db_tbls <- dbListTables(db)
tbl_list <- lapply(db_tbls, dbReadTable, conn = db)
tbl_list <- setNames(tbl_list, db_tbls)
dbDisconnect(db)
> lapply(tbl_list, head)
$iris
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
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
$mtcars
mpg cyl disp hp drat wt qsec vs am gear carb
1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
4 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
5 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
6 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
两种心态:
所有 tables/data 到一个命名列表中:
alldat <- lapply(setNames(nm = dbListTables(db)), dbReadTable, conn = db)
这样做的好处是,如果表格具有相似的含义,那么您可以使用 lapply
对每个表格应用相同的功能。另一个好处是来自一个数据库的所有数据都存储在一起。
有关处理帧列表的信息,请参阅 How do I make a list of data frames?。
如果你想让它们作为全局(或封闭)环境中的实际变量,那么取前面的alldat
,和
ign <- list2env(alldat, envir = .GlobalEnv)
来自 list2env
的 return 值是我们传递给 list2env
的环境,因此它在这种情况下并不是非常有用(尽管它在其他时候很有用)。我将其捕获到 ign
中的唯一原因是减少控制台上的混乱……这是次要的。 list2env
主要产生副作用,因此在这种情况下 return 值并不重要。
我有一个包含许多表的大型 SQLite 数据库。我已经使用 RSQLite 和 DBI 包在 RStudio 中建立了到这个数据库的连接。 (我将这个数据库命名为db
)
library(RSQLite)
library(DBI)
目前我必须读入所有表格并手动为它们分配一个名称。例如:
country <- dbReadTable(db, "country")
date <- dbReadTable(db, "date")
#...and so on
您可以看到,如果您有很多表,这可能是一个非常耗时的过程。
所以我想知道是否可以创建一个新函数或使用现有函数(例如 lapply()
?)来更有效地完成此操作并从根本上加快此过程?
非常感谢任何建议:)
您可以使用 dbListTables()
生成 SQLite 数据库中所有 table 名称的字符向量,并使用 lapply()
将它们高效地导入 R。我会首先检查您是否能够将数据库中的所有 table 导入内存。
下面是一个可重现的例子:
library(RSQLite)
library(DBI)
db <- dbConnect(RSQLite::SQLite(), ":memory:")
dbWriteTable(db, "mtcars", mtcars)
dbWriteTable(db, "iris", iris)
db_tbls <- dbListTables(db)
tbl_list <- lapply(db_tbls, dbReadTable, conn = db)
tbl_list <- setNames(tbl_list, db_tbls)
dbDisconnect(db)
> lapply(tbl_list, head)
$iris
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
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
$mtcars
mpg cyl disp hp drat wt qsec vs am gear carb
1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
4 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
5 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
6 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
两种心态:
所有 tables/data 到一个命名列表中:
alldat <- lapply(setNames(nm = dbListTables(db)), dbReadTable, conn = db)
这样做的好处是,如果表格具有相似的含义,那么您可以使用
lapply
对每个表格应用相同的功能。另一个好处是来自一个数据库的所有数据都存储在一起。有关处理帧列表的信息,请参阅 How do I make a list of data frames?。
如果你想让它们作为全局(或封闭)环境中的实际变量,那么取前面的
alldat
,和ign <- list2env(alldat, envir = .GlobalEnv)
来自
list2env
的 return 值是我们传递给list2env
的环境,因此它在这种情况下并不是非常有用(尽管它在其他时候很有用)。我将其捕获到ign
中的唯一原因是减少控制台上的混乱……这是次要的。list2env
主要产生副作用,因此在这种情况下 return 值并不重要。