Tôi đang tìm cách tính toán nội dung GC cho chuỗi DNA được đọc từ tệp FASTA nhanh hơn. Điều này nhún xuống để lấy một chuỗi và đếm số lần chữ 'G' hoặc 'C' xuất hiện. Tôi cũng muốn chỉ định phạm vi các ký tự cần xem xét.Cách nhanh hơn để chia chuỗi và đếm ký tự bằng R?
Tôi có chức năng hoạt động khá chậm và gây tắc nghẽn trong mã của tôi. Nó trông giống như thế này:
##
## count the number of GCs in the characters between start and stop
##
gcCount <- function(line, st, sp){
chars = strsplit(as.character(line),"")[[1]]
numGC = 0
for(j in st:sp){
##nested ifs faster than an OR (|) construction
if(chars[[j]] == "g"){
numGC <- numGC + 1
}else if(chars[[j]] == "G"){
numGC <- numGC + 1
}else if(chars[[j]] == "c"){
numGC <- numGC + 1
}else if(chars[[j]] == "C"){
numGC <- numGC + 1
}
}
return(numGC)
}
Chạy Rprof mang lại cho tôi kết quả như sau:
> a = "GCCCAAAATTTTCCGGatttaagcagacataaattcgagg"
> Rprof(filename="Rprof.out")
> for(i in 1:500000){gcCount(a,1,40)};
> Rprof(NULL)
> summaryRprof(filename="Rprof.out")
self.time self.pct total.time total.pct
"gcCount" 77.36 76.8 100.74 100.0
"==" 18.30 18.2 18.30 18.2
"strsplit" 3.58 3.6 3.64 3.6
"+" 1.14 1.1 1.14 1.1
":" 0.30 0.3 0.30 0.3
"as.logical" 0.04 0.0 0.04 0.0
"as.character" 0.02 0.0 0.02 0.0
$by.total
total.time total.pct self.time self.pct
"gcCount" 100.74 100.0 77.36 76.8
"==" 18.30 18.2 18.30 18.2
"strsplit" 3.64 3.6 3.58 3.6
"+" 1.14 1.1 1.14 1.1
":" 0.30 0.3 0.30 0.3
"as.logical" 0.04 0.0 0.04 0.0
"as.character" 0.02 0.0 0.02 0.0
$sampling.time
[1] 100.74
Bất cứ lời khuyên để làm mã này nhanh hơn?
Đối với những gì nó có giá trị, tôi đã kết thúc quyết định rằng R là hoàn toàn quá chậm để xử lý ~ 3 tỷ basepairs từ bộ gen của con người và sử dụng một chút kịch bản perl thay thế. – chrisamiller