0

遺伝子のセットと既存の遺伝子のペアが与えられた場合、まだ存在しない新しい遺伝子のペアを生成したいと考えています。

遺伝子ファイルの形式は次のとおりです。

123    
134   
23455  
3242  
3423  
...  
...  

遺伝子ペア ファイルの形式は次のとおりです。

12,345    
134,23455   
23455,343  
3242,464452  
3423,7655  
...  
...  

しかし、known_interactions と new_pairs の間に共通する要素はまだほとんどありません。エラーがどこにあるのかわかりません。

引数については、
perl generate_random_pairs.pl entrez_genes_file known_interactions_file 250000 15880
の共通要素を取得しました。数値 250000 は、プログラムに生成させたいランダム ペアの数を示しています。

#! usr/bin/perl

use strict;
use warnings;

if (@ARGV != 3) {
    die "Usage: generate_random_pairs.pl <entrez_genes> <known_interactions> <number_of_interactions>\n";
}
my ($e_file, $k_file, $interactions) = @ARGV;

open (IN, $e_file) or die "Error!! Cannot open $e_file\n";
open (IN2, $k_file) or die "Error!! Cannot open $k_file\n";

my @e_file = <IN>; s/\s+\z// for @e_file;
my @k_file = <IN2>; s/\s+\z// for @k_file;

my (%known_interactions);

my %entrez_genes;
$entrez_genes{$_}++ foreach @e_file;

foreach my $line (@k_file) {
    my @array = split (/,/, $line);
    $known_interactions{$array[0]} = $array[1];
}
my $count = 0;

foreach my $key1 (keys %entrez_genes) {
    foreach my $key2 (keys %entrez_genes) {
        if ($key1 != $key2) {
            if (exists $known_interactions{$key1} && ($known_interactions{$key1} == $key2)) {next;}
            if (exists $known_interactions{$key2} && ($known_interactions{$key2} == $key1)) {next;}
            if ($key1 < $key2) { print "$key1,$key2\n"; $count++; }
            else { print "$key2,$key1\n"; $count++; }
        }
        if ($count == $interactions) {
            die "$count\n";
        }
    }
}
4

2 に答える 2

0

あなたのコードには何も問題はありません。コンマの後または行末に、データに空白が含まれているのではないでしょうか? たとえば、数字フィールドだけを抽出する方が安全です。

my @e_file = map /\d+/g, <IN>;

また、要素の存在を確認できるように、ペアの両方の要素をハッシュ キーとして保持することをお勧めします。また、小さい方の数字が常に最初になるようにすれば、2 回のルックアップを行う必要はありません。

この例はうまくいくはずです。要件のランダム選択部分には対処しませんが、それは独自のコードにはなく、差し迫った問題ではありませんでした

use strict;
use warnings;

@ARGV = qw/ entrez_genes.txt known_interactions.txt 9 /;

if (@ARGV != 3) {
    die "Usage: generate_random_pairs.pl <entrez_genes> <known_interactions> <number_of_interactions>\n";
}

my ($e_file, $k_file, $interactions) = @ARGV;

open my $fh, '<', $e_file or die "Error!! Cannot open $e_file: $!";
my @e_file = sort { $a <=> $b } map /\d+/g, <$fh>;

open $fh, '<', $k_file or die "Error!! Cannot open $k_file: $!";
my %known_interactions;
while (<$fh>) {
  my $pair = join ',', sort { $a <=> $b } /\d+/g;
  $known_interactions{$pair}++;
}

close $fh;

my $count = 0;
PAIR:
for my $i (0 .. $#e_file-1) {
  for my $j ($i+1 .. $#e_file) {
    my $pair = join ',', @e_file[$i, $j];
    unless ($known_interactions{$pair}) {
      print $pair, "\n";
      last PAIR if ++$count >= $interactions;
    }
  }
}

print "\nTotal of $count interactions\n";
于 2012-08-14T02:44:43.840 に答える
-1

まず第一に、あなたは既知の相互作用のファイルからチョッピング(改行を削除)していません。つまり、次のようなファイルが与えられます。

1111,2222

このハッシュを作成します:

 $known_interactions{1111} = "2222\n";

これが、重複したエントリを取得している理由である可能性があります。私の推測では(実際の入力ファイルがないとわかりませんが)、これらのループは正常に機能するはずです。

 map{
    chomp;
    $entrez_genes{$_}++ ;
 }@e_file;

map {
    chomp;
    my @array = sort(split (/,/));
    $known_interactions{$array[0]} = $array[1];
}@k_file;

また、原則として、相互作用するペアを並べ替えると、私の生活は楽になります(バイオインフォマティクスの喜び:))。そうすれば、111,222と222,111が同じように扱われ、コードにあるような複数のifステートメントを回避できることがわかります。

次のループは次のようになります(IMHOの方が読みやすくなります)。

my @genes=keys(%entrez_genes);
for (my $i=0; $i<=$#genes;$i++) {
   for (my $k=$n; $k<=$#genes;$k++) {
     next if $genes[$n] == $genes[$k];
     my @pp=sort($genes[$n],$genes[$k]);
     next unless exists $known_interactions{$pp[0]};
     next if $known_interactions{$pp[0]} == $pp[1];
     print "$pp[0], $pp[1]\n";
     $count++;
     die "$count\n" if $count == $interactions;
  }
}
于 2012-08-14T01:36:00.077 に答える