Tôi đang cố gắng thực hiện một giao điểm theo dõi di truyền đơn giản trong R và chạy vào các vấn đề hiệu suất lớn, có thể liên quan đến việc tôi sử dụng các vòng lặp.R tối ưu hóa: Làm cách nào để tránh vòng lặp for trong trường hợp này?
Trong trường hợp này, tôi có các cửa sổ được xác định trước trong khoảng thời gian 100bp và tôi đang cố gắng tính toán số lượng cửa sổ được bao phủ bởi các chú thích trong danh sách của tôi. Đồ họa, nó trông giống như sau:
0 100 200 300 400 500 600
windows: |-----|-----|-----|-----|-----|-----|
mylist: |-| |-----------|
Vì vậy, tôi đã viết một số mã để làm việc đó, nhưng nó khá chậm và đã trở thành một nút cổ chai trong mã của tôi:
##window for each 100-bp segment
windows <- numeric(6)
##second track
mylist = vector("list")
mylist[[1]] = c(1,20)
mylist[[2]] = c(120,320)
##do the intersection
for(i in 1:length(mylist)){
st <- floor(mylist[[i]][1]/100)+1
sp <- floor(mylist[[i]][2]/100)+1
for(j in st:sp){
b <- max((j-1)*100, mylist[[i]][1])
e <- min(j*100, mylist[[i]][2])
windows[j] <- windows[j] + e - b + 1
}
}
print(windows)
[1] 20 81 101 21 0 0
Đương nhiên, điều này đang được được sử dụng trên các tập dữ liệu lớn hơn nhiều so với ví dụ tôi cung cấp ở đây. Thông qua một số hồ sơ, tôi có thể thấy rằng các nút cổ chai là trong vòng, nhưng nỗ lực vụng về của tôi để vectorize nó bằng cách sử dụng * chức năng áp dụng dẫn đến mã chạy một thứ tự cường độ chậm hơn.
Tôi cho rằng tôi có thể viết điều gì đó trong C, nhưng tôi muốn tránh điều đó nếu có thể. Bất cứ ai có thể đề xuất một cách tiếp cận khác mà sẽ tăng tốc độ tính toán này?
Dường như vấn đề có thể được giải quyết bằng gói 'IRanges' trong Bioconductor. Đó có thể là một điểm khởi đầu tốt. – andrewj
hrmm - cảm ơn con trỏ - có vẻ đầy hứa hẹn. – chrisamiller