0

我有两个数组:fasta_ids 和 frags_by_density。两者都包含相同的 ≈1300 个字符串。fasta_ids 是按数字排序的,例如 ['frag1', 'frag2', 'frag3'...] frags_by_density 包含以不同顺序排列的相同字符串,例如 ['frag14', 'frag1000'...]

frag_by_density 的排序方式与问题无关(但对于任何生物信息学家来说,'frags' 是按 snp 密度排序的 contigs)。

我想要做的是在 frag_by_density 数组中找到索引,其中包含 fasta_ids 中的每个字符串。我想得到一个包含这些位置(索引)的新数组,它的顺序与 fasta_ids 数组的顺序相同。

例如,如果“frag”字符串在 fasta_ids 和 frags_by_density 数组中的顺序相同,则输出数组将为:[0, 1, 2, 3...]。在此示例中,输出数组 (2) 的索引 2 处的值对应于 fasta_ids ('frag3') 的索引 2 处的值 - 所以我可以从中推断出 'frag3' 字符串位于 frags_by_density 中的索引 2 .

下面是我提出的代码,目前它陷入了我认为是无限循环的状态。我已经注释了每个部分应该做什么:

x = 0 #the value of x will represent the position (index) in the density array
position_each_frag_id_in_d = [] #want to get positions of the values in frag_ids in frags_by_density
iteration = []
fasta_ids.each do |i|
    if frags_by_density[x] == i
        position_each_frag_id_in_d << x #if the value at position x matches the value at i, add it to the new array
        iteration << i
    else
        until frags_by_density[x] == i #otherwise increment x until they do match, and add the position
            x +=1
        end
        position_each_frag_id_in_d << x
        iteration << i
    end
    x = iteration.length # x should be incremented, however I cannot simply do: x += 1, as x may have been incremented by the until loop
end
puts position_each_frag_id_in_d

这是一个相当复杂的问题。希望有一个更简单的解决方案,或者至少有人可以修改我已经开始的内容。

更新:重命名数组 fasta_ids,因为它在代码中(如果有任何混淆,抱歉)fasta_id = frag_id

4

1 回答 1

0

非优化版本。array.index(x)返回数组中 x 的索引,如果未找到则返回 nil。compact然后从数组中删除 nil 元素。

position_of_frag_id_in_d = frag_ids.map{|x| frag_by_density.index(x)}.compact

于 2013-09-26T15:17:09.183 回答