【发布时间】:2019-06-19 20:05:20
【问题描述】:
虽然这是一个genomics 的问题,但由于它处理的是字符串的拼接(获取子集),我认为它与此受众相关,而不是与Bioconductor 单独相关。
很简单,我有一个长字符串列表(基因组的染色体)。例如,我使用 Bioconductor Biostrings 包创建并存储了 10 条染色体:
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,我可以这样实现:
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 或任何其他方式更快地完成此操作。
【问题讨论】:
-
transcript.gtf.df$seqnames[1]是否应该在第二个sapply中被索引1或e? -
transcript_id在gtf.df的所有行中都有相同的seqnames,所以我只是使用transcript.gtf.df$seqnames[1]抓住第一个