【发布时间】:2018-02-27 18:24:02
【问题描述】:
我收集了不同长度的 DNA 测序读数,从最长到最短排序。我想知道我可以在一组中包含的最大读取数,以使该组的 N50 高于某个阈值t
对于任何给定的读取集,数据总量只是读取长度的累积总和。 N50 被定义为读取的长度,这样一半的数据包含在读取中,至少有那么长。
我在下面有一个解决方案,但对于非常大的读取集来说它很慢。我尝试对其进行矢量化处理,但速度较慢(可能是因为我的阈值通常相对较大,因此我在下面的解决方案很早就停止了计算)。
这是一个有效的例子:
df = data.frame(l = 100:1) # read lengths
df$cs = cumsum(df$l) # getting the cumulative sum is easy and quick
t = 95 # let's imagine that this is my threshold N50
for(i in 1:nrow(df)){
N50 = df$l[min(which(df$cs>df$cs[i]/2))]
if(N50 < t){ break }
}
# the loop will have gone one too far, so I subtract one
number.of.reads = as.integer(i-1)
这适用于小型数据集,但我的实际数据更像是 5m 读取,长度从 ~200,000 到 1 不等(更长的读取很少见),我对 100,000 的 N50 感兴趣,然后它变得漂亮慢。
这个例子更接近现实。在我的桌面上大约需要 15 秒。
l = ceiling(runif(100000, min = 0, max = 19999))
l = sort(l, decreasing = T)
df = data.frame(l = l)
df$cs = cumsum(df$l)
t = 18000
for(i in 1:nrow(df)){
n = df$l[min(which(df$cs>df$cs[i]/2))]
if(n < t){ break }
}
result = as.integer(i-1)
所以,我对任何可以显着优化此功能的想法、提示或技巧都很感兴趣。看起来这应该是可能的,但我没有想法。
【问题讨论】:
标签: r loops optimization vectorization