Хотя это вопрос genomics
, поскольку он имеет дело с объединением (получением подмножеств) строк, я думаю, что это актуально для этой аудитории, а не только Bioconductor
.
Довольно просто, у меня есть списокдлинных струн (хромосомы генома).Например, я создаю и сохраняю 10 хромосом, используя пакет Bioconductor
Biostrings
:
set.seed(1)
set <- NULL
for (i in 1:10) set <- c(set,paste(sample(Biostrings::DNA_ALPHABET[1:4],10000,replace=T),collapse=""))
genome.set <- Biostrings::DNAStringSet(set)
names(genome.set) <- paste0("chr",1:10)
И затем у меня есть data.frame
координат транскрипта (из файла GTF
), где каждыйТранскрипт может иметь несколько строк:
library(dplyr)
gtf.df <- data.frame(seqnames = sample(names(genome.set),100,replace=T),
strand = sample(c("+","-"),100,replace=T),
start = sample(1:9000,100,replace=F)) %>%
dplyr::mutate(end = start+sample(1:1000,100,replace = F))
gtf.df <- gtf.df %>% dplyr::group_by(seqnames) %>%
dplyr::arrange(start,end) %>%
dplyr::mutate(transcript_id = paste0(seqnames,"_",sample(1:8,length(seqnames),replace=T))) %>%
dplyr::ungroup()
И я хочу, чтобы каждый транскрипт соединял свои последовательности, выделяя их из genome.set
.
Повторное использование Biostrings
Iдобиться этого следующим образом:
transcript_ids <- unique(gtf.df$transcript_id)
transcript.seqs <- sapply(1:length(transcript_ids),function(t){
transcript.gtf.df <- gtf.df %>% dplyr::filter(gtf.df$transcript_id == transcript_ids[t])
transcript.seq <- paste(sapply(1:nrow(transcript.gtf.df),function(e)
unname(as.character(Biostrings::subseq(genome.set[which(names(genome.set) == transcript.gtf.df$seqnames[1])],start=transcript.gtf.df$start[e],end=transcript.gtf.df$end[e])))
),collapse="")
if(transcript.gtf.df$strand[1] == "-") transcript.seq <- unname(as.character(Biostrings::reverseComplement(Biostrings::DNAString(transcript.seq))))
return(transcript.seq)
})
Моя проблема в том, что у меня есть 4520919
стенограммы в моих реальных данных, и последняя часть занимает много времени.Поэтому мой вопрос заключается в том, можно ли и как это сделать быстрее, используя Biostrings
или любым другим способом.