【问题标题】:Need help input text file via ruby into hash than selecting same vaule from hash [closed]需要帮助通过 ruby​​ 将文本文件输入到哈希中,而不是从哈希中选择相同的值 [关闭]
【发布时间】:2014-03-02 00:16:39
【问题描述】:

我的文本文件数据如下所示:(蛋白质-蛋白质相互作用数据)

转录因子蛋白

Myc Rilpl1

Mycn Rilpl1

Mycn "Wdhd1,Socs4"

Sox2 Rilpl1

Sox2 "Wdhd1,Socs4"

纳米“Wdhd1,Socs4”

我希望它看起来像这样:(查看每个蛋白质与多少个转录因子相互作用)

蛋白质转录因子

Rilpl1 Myc、Mycn、Sox2

Wdhd1 Mycn、Sox2、Nanog

Socs4 Mycn、Sox2、Nanog

使用我的代码后,我得到的是:(我怎样才能摆脱“”并将两个蛋白质分开到新行)

蛋白质转录因子

Rilpl1 Myc、Mycn、Sox2

"Wdhd1,Socs4" Mycn, Nanog, Sox2

这是我的代码:

input_file = ARGV[0]
hash = {}
File.readlines(input_file, "\r").each do |line|
  transcription_factor, protein = line.chomp.split("\t")

  if hash.has_key? protein
    hash[protein] << transcription_factor
  else
    hash[protein] = [transcription_factor]
  end
end

hash.each do |key, value|
  if value.count > 2
    string = value.join(', ')
    puts "#{key}\t#{string}"
  end
end

【问题讨论】:

  • transcription_factor prtoein [sic]protein transcription_factor 去哪儿了?
  • 对不起,你什么意思?
  • 你的文本文件真的每行文本之间都有空行吗?如果没有,请修正您的示例,以便它们准确无误。与现实生活中的 GIGO 一样,我们需要良好的输入样本。
  • 另外,制表符不会分隔行中的字段,但您甚至没有解释应该有制表符。 -1 和关闭投票。
  • 顺便问一下,什么是“蛋白质”?我确信 OP 的问题并不是来自专业人士的问题,但对我来说仍然是一个问题。

标签: ruby arrays hash text-files readlines


【解决方案1】:

这是解决问题的快速方法:

...
transcription_factor, proteins = line.chomp.split("\t")
proteins.to_s.gsub(/"/,'').split(',').each do |protein|
  if hash.has_key? protein
    hash[protein] << transcription_factor
  else
    hash[protein] = [transcription_factor]
  end
end
...

上面的 sn-p 基本上会从蛋白质中删除引号(如果有的话),然后对于找到的每个蛋白质,它都会执行您已经编写的操作。

如果你想消除如果你可以像这样定义散列:

hash = Hash.new {|hash,key| hash[key]= []}

这意味着对于每个新的key,它将返回一个新数组。所以现在你可以跳过if

hash[protein] << transcription_factor

【讨论】:

  • 非常感谢,它有效。
  • if...else...end 所做的另一种方式是:(hash[protein] ||= []) &lt;&lt; transcription_factor。这消除了对哈希默认值的需要。
猜你喜欢
  • 2014-02-17
  • 2012-07-08
  • 2016-10-07
  • 2019-05-07
  • 2018-04-24
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 2011-04-17
相关资源
最近更新 更多