我有以下数据:
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中执行此操作吗?我有一系列的菌株和基因。
答案 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"]