如何生成矩阵?

时间:2012-02-14 14:01:43

标签: ruby matrix

我有以下数据:

gene strain
A1   S1
A1   S4
A1   S8
A2   S5
A2   S4
A2   S9
A3   S4
A3   S1
A3   S10

我需要产生一个具有基因与菌株的基质,I.E。,我需要显示哪些基因存在于哪个菌株中,因此基质将如下所示:

 S1 S4 S5 S8 S9 S10
A1   
A2
A3

任何人都可以指导我通过最好,最快捷的方式在Ruby中执行此操作吗?我有一系列的菌株和基因。

3 个答案:

答案 0 :(得分:2)

您可以通过多种方式代表所需的基因 - 菌株基质。最好的方法取决于你想用矩阵做什么。您想比较不同基因中存在哪些菌株吗?或者比较哪些基因具有给定的菌株?您是否希望能够查找给定基因是否具有给定的菌株?

一种简单的方法是Hash,其键为Set s:

require 'set'
h = Hash.new { |h,k| h[k] = Set.new }
# assuming you already have the data in an array of arrays...
data.each do |gene,strain|
  h[gene] << strain
end

如果你只想在屏幕上打印一个矩阵,这里有一个小脚本:

require 'set'
genes, strains = Set.new, Set.new
h = Hash.new { |h,k| h[k] = Set.new }
# again assuming you already have the data in an array of arrays
data.each { |g,s| h[g] << s; genes << g; strains << s }
genes, strains = genes.sort, strains.sort

FIELD_WIDTH = 5    
BLANK       = " "*FIELD_WIDTH
X           = "X" + (" " * (FIELD_WIDTH - 1))
def print_fixed_width(str)
  str = str[0,FIELD_WIDTH]
  print str
  print " "*(FIELD_WIDTH-str.length)
end

# now print the matrix
print BLANK
strains.each { |s| print_fixed_width(s) }
puts

genes.each do |g|
  print_fixed_width(g)
  strains.each { |s| h[g].include?(s) ? print X : print BLANK }
  puts
end

请发布有关您想要对矩阵做什么的更多详细信息,如有必要,我会提供更合适的选项。

答案 1 :(得分:0)

您可以在二维数组中表示:

arr = [[1,1],[1,4],[1,8],[2,5],[2,4],[2,9],[3,4],[3,1],[3,10]]
快速而脏的桌子:

s = "  1234567890\n"
(1..3).each do |i|
  s << i.to_s << ' '
  (1..10).each do |j|
    s << ( arr.include?( [i,j] ) ? 'x' : ' ' )
  end
  s << "\n"
end
puts s

  1234567890
1 x  x   x  
2    xx   x 
3 x  x     x

答案 2 :(得分:0)

如果你“需要检查哪些基因存在于哪种菌株中”,那么哈希就足够了:

str = <<DOC
A1   S1
A1   S4
A1   S8
A2   S5
A2   S4
A2   S9
A3   S4
A3   S1
A3   S10
DOC

ar = str.lines.map{|line| line.split(/\s+/) } #string to array of arrays
genes_from_strain = Hash.new{|h,k| h[k]=[] }  #This hash will give an empty array if key is not present
ar.each{|pair| genes_from_strain[pair.last] << pair.first }
p genes_from_strain['S1'] #=>["A1", "A3"]