如何使用 sqlite 数据库填充 bigstatsr::FBM 以供以后使用?
Posted
技术标签:
【中文标题】如何使用 sqlite 数据库填充 bigstatsr::FBM 以供以后使用?【英文标题】:How to populate bigstatsr::FBM with sqlite database for later consumption? 【发布时间】:2021-03-03 21:44:41 【问题描述】:我是 bigstatsr 软件包的新手。我有一个 sqlite 数据库,我想将其转换为 40k 行(基因)60K 列(样本)的 FBM 矩阵以供以后使用。我找到了如何用随机值填充矩阵的示例,但我不确定用我的 sqlite 数据库中的值填充矩阵的最佳方法是什么。
目前我是按顺序执行的,这里有一些模拟代码:
library(bigstatsr)
library(RSQLite)
library(dplyr)
number_genes <- 50e3
number_samples <- 70e3
large_genomic_matrix <- bigstatsr::FBM(nrow = number_genes,
ncol = number_samples,
type = "double",
backingfile = "fbm_large_genomic_matrix")
# Code to get a single df at the time
database_connection <- dbConnect(RSQLite::SQLite(), "database.sqlite")
sample_index_counter <- 1
for(current_sample in vector_with_sample_names)
sqlite_df <- DBI::dbListTables(conn = database_connection) %>%
dplyr::tbl("genomic_data") %>%
dplyr::filter(sample == current_sample) %>%
dplyr::collect()
large_genomic_matrix[, sample_index_counter] <- sqlite_df$value
sample_index_counter <- sample_index_counter + 1
big_write(large_genomic_matrix, "large_genomic_matrix.out", every_nrow = 1000, progress = interactive())
我有两个问题:
-
有没有更有效地填充矩阵的方法?不确定是否可以在这里使用 big_apply,也许是 foreach
我是否总是必须使用 big_write 才能稍后加载我的矩阵?如果是这样,为什么我不能只使用 bk 文件?
提前致谢
【问题讨论】:
【参考方案1】:这是您自己进行的非常好的第一次尝试。
这里效率低下的是为每个样本测试dplyr::filter(sample == current_sample)
。我会先尝试使用match()
来获取索引。然后,有点低效的是单独填充每一列。如您所说,您可以使用big_apply()
分块执行此操作。
big_write()
用于将 FBM 写入某个文本文件(例如 csv)。您需要在这里使用FBM()$save()
(自述文件中示例的第二行),然后在.rds 文件(自述文件的下一行)上使用big_attach()
。
【讨论】:
谢谢,我会尝试这些解决方案!以上是关于如何使用 sqlite 数据库填充 bigstatsr::FBM 以供以后使用?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用预填充的 sqlite 数据库发布 phonegap 3.5 应用程序
如何在 Flutter 中使用预填充的 sqlite 数据库我的应用程序
如何使用从我的 SQLite 数据库中检索到的数据填充 tkinter 下拉框?