[Bioc-sig-seq] Fast inject into XStringSet objects

Thomas Girke thomas.girke at ucr.edu
Tue May 5 01:48:28 CEST 2009


Dear Developers,

Is there an efficient method available for replacing base calls in 
sequences by Ns (or any other character) at positions where the quality 
score drops below some arbitrary threshold. So far we have been using 
the following code for this purpose. In general this approach works fine. 
However, the R loop for applying this function makes it slow for very large 
data sets with millions of sequences. 

Is there a method available for achieving the same result more efficiently? 

Considering the available resources in Biostrings, I am wondering if it wouldn't 
make a lot of sense of using Biostrings' sequence masking method along with the 
injectHardMask function for this purpose. However, at this point I am only aware 
of methods for applying masks efficiently to a single sequence in a XString object, 
but not to many sequences stored in a XStringSet object. 


#################
## Sample Code ##
#################
## Create example data set with random data
library(Biostrings)
dset <- DNAStringSet(sapply(1:100, function(x) paste(sample(c("A","T","G","C"), 20, replace=T), collapse=""))) 
myqlist <- lapply(1:100, function(x) sample(1:40, 20, replace=T)) # Create random Phred score list.
myqual <- sapply(myqlist, function(x) toString(PhredQuality(x))) 
myqual <- PhredQuality(myqual) 
dsetq1 <- QualityScaledDNAStringSet(dset, myqual) 

## Define in character inject function XStringSetInject     
XStringSetInject <- function(myseq=dset[[1]], myqual=myqual[1], cutoff=20, mychar="N") { 
        mypos <- which(as.integer(myqual)<cutoff)
        return(toString(replaceLetterAt(myseq, which(as.integer(myqual)<cutoff), rep(mychar, length(mypos)))))
}
## Apply XStringSetInject function to all sequences.
dvec <- sapply(1:length(dset), function(x) XStringSetInject(myseq=dset[[x]], myqual=myqual[x], cutoff=20))
dset2 <- DNAStringSet(dvec)
names(dset2) <- paste("d", 1:length(dvec), sep="")
names(myqual) <- paste("d", 1:length(dvec), sep="")
dsetq2 <- QualityScaledDNAStringSet(dset2, myqual) 

## Compare dsetq1 and dsetq2
dsetq1[1:2] 
dsetq2[1:2] 


> sessionInfo()
R version 2.9.0 (2009-04-17) 
x86_64-unknown-linux-gnu 

locale:
LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=C;LC_MESSAGES=en_US.UTF-8;LC_PAPER=en_US.UTF-8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] Biostrings_2.12.1 IRanges_1.2.0    

loaded via a namespace (and not attached):
[1] Biobase_2.4.0


Thanks in advance,

Thomas



More information about the Bioc-sig-sequencing mailing list