如何使用 sqlite 数据库填充 bigstatsr::FBM 以供以后使用?
How to populate bigstatsr::FBM with sqlite database for later consumption?
我是 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 文件?
提前致谢
这是您自己的第一次尝试。
这里效率低下的是为每个样本测试 dplyr::filter(sample == current_sample)
。我会先尝试使用 match()
来获取索引。然后,单独填充每一列会有点低效。正如您所说,您可以使用 big_apply()
来按块执行此操作。
big_write()
用于将 FBM 写入某个文本文件(例如 csv)。您在这里想要的是使用 FBM()$save()
(README 中示例的第二行),然后在 .rds 文件(README 的下一行)上使用 big_attach()
。
我是 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 文件?
提前致谢
这是您自己的第一次尝试。
这里效率低下的是为每个样本测试
dplyr::filter(sample == current_sample)
。我会先尝试使用match()
来获取索引。然后,单独填充每一列会有点低效。正如您所说,您可以使用big_apply()
来按块执行此操作。big_write()
用于将 FBM 写入某个文本文件(例如 csv)。您在这里想要的是使用FBM()$save()
(README 中示例的第二行),然后在 .rds 文件(README 的下一行)上使用big_attach()
。