Как заполнить bigstatsr::FBM базой данных sqlite для последующего использования?

Я новичок в пакете bigstatsr. У меня есть база данных sqlite, которую я хочу преобразовать в матрицу FBM из 40 тыс. строк (генов) и 60 тыс. столбцов (образцов) для последующего использования. Я нашел примеры того, как заполнить матрицу случайными значениями, но я не уверен, как лучше всего заполнить ее значениями из моей базы данных 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 ответ

Это очень хорошая первая попытка, которую вы должны сделать самостоятельно.

  1. Что здесь неэффективно, так это тестировать dplyr::filter(sample == current_sample)для каждого отдельного образца. я бы попробовал использовать match()сначала получить индексы. Тогда было бы немного неэффективно заполнять каждый столбец по отдельности. Как вы сказали, вы можете использовать big_apply()сделать это блоками.

  2. big_write()предназначен для записи FBM в некоторый текстовый файл (например, csv). Здесь вы хотите использовать FBM()$save()(вторая строка примера в README), а затем используйте big_attach()в файле .rds (следующая строка README).

Другие вопросы по тегам