Как заполнить 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())
У меня есть два вопроса:
- Есть ли способ более эффективного заполнения матрицы? Не уверен, что здесь можно использовать big_apply, возможно, foreach
- Всегда ли мне нужно использовать big_write, чтобы позже загрузить мою матрицу? Если да, то почему я не могу просто использовать файл bk?
заранее спасибо
1 ответ
Это очень хорошая первая попытка, которую вы должны сделать самостоятельно.
Что здесь неэффективно, так это тестировать
dplyr::filter(sample == current_sample)
для каждого отдельного образца. я бы попробовал использоватьmatch()
сначала получить индексы. Тогда было бы немного неэффективно заполнять каждый столбец по отдельности. Как вы сказали, вы можете использоватьbig_apply()
сделать это блоками.big_write()
предназначен для записи FBM в некоторый текстовый файл (например, csv). Здесь вы хотите использоватьFBM()$save()
(вторая строка примера в README), а затем используйтеbig_attach()
в файле .rds (следующая строка README).