如何使用 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())

我有两个问题:

  1. 有没有更有效地填充矩阵的方法?不确定这里是否可以使用 big_apply,也许是 foreach
  2. 我是否总是必须使用 big_write 才能稍后加载我的矩阵?如果是这样,为什么我不能只使用 bk 文件?

提前致谢

这是您自己的第一次尝试。

  1. 这里效率低下的是为每个样本测试 dplyr::filter(sample == current_sample)。我会先尝试使用 match() 来获取索引。然后,单独填充每一列会有点低效。正如您所说,您可以使用 big_apply() 来按块执行此操作。

  2. big_write() 用于将 FBM 写入某个文本文件(例如 csv)。您在这里想要的是使用 FBM()$save()(README 中示例的第二行),然后在 .rds 文件(README 的下一行)上使用 big_attach()