Как мне сгенерировать матрицу? - PullRequest
1 голос
/ 14 февраля 2012

У меня есть следующие данные:

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

Мне нужно создать матрицу, которая имеет гены против штаммов, т.е. мне нужно показать, какие гены присутствуют в каких штаммах, поэтому матрица будет выглядеть так:

 S1 S4 S5 S8 S9 S10
A1   
A2
A3

Может ли кто-нибудь помочь мне найти лучший и самый быстрый способ сделать это в Ruby? У меня есть массив штаммов и генов.

Ответы [ 3 ]

2 голосов
/ 14 февраля 2012

Есть много способов, которыми вы можете представить нужную вам матрицу генов.Лучший способ будет зависеть от того, что вы хотите сделать с матрицей.Хотите сравнить, какие штаммы присутствуют в разных генах?Или сравнить, какие гены имеют данный штамм?Вы просто хотите узнать, имеет ли данный ген данный штамм?

Одним простым способом будет 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
* 1007.* Если вы хотите только напечатать матрицу на экране, вот небольшой сценарий для этого:
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

Пожалуйста, опубликуйте более подробную информацию о том, что вы хотите сделать с матрицей, и я предоставлюболее подходящий вариант при необходимости.

0 голосов
/ 14 февраля 2012

Если вам «нужно проверить, какие гены присутствуют в каких штаммах», то хеш будет достаточно:

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"]
0 голосов
/ 14 февраля 2012

Вы можете представить это в 2d массиве:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...