0

重複の可能性:
ATGCCGCTGCGC などの DNA 配列の遺伝子グラフをプロットする方法は?

2 つの DNA 配列 (それぞれ 60 文字の長さ) を並べて比較し、配列の一致と不一致の比率を表示する Perl スクリプトを作成しようとしています。しかし、私はあまり運がありません。それが役立つ場合は、コードをアップロードできますが、役に立ちません。これは、以下で達成しようとしているものの例です。

例えば

A T C G T A C
| | | | | | |
T A C G A A C

したがって、上記の例の一致は 4 になり、不一致は 3 になります。4.3 の比率を与えます。

どんな助けでも大歓迎です。ありがとう。

4

7 に答える 7

0

これを行うには多くの方法があるというビル・ルパートの権利。別のものがあります:

use Modern::Perl;

say compDNAseq( 'ATCGTAC', 'TACGAAC' );

sub compDNAseq {
    my $total = my $i = 0;
    $total += substr( $_[1], $i++, 1 ) eq $1 while $_[0] =~ /(.)/g;
    sprintf '%.2f', $total / ( $i - $total );
}

出力:

1.33
于 2012-08-14T05:51:13.783 に答える
0

xorこれは、比較の一致ごとに NULL、\0 を与えるアプローチです。

#!/usr/bin/perl
use strict;
use warnings;

my $d1='ATCGTAC'; 
my $d2='TACGAAC'; 

my $len = length $d1; # assumes $d1 and $d2 are the same length

my $matches = () = ($d1 ^ $d2) =~ /\0/g;

printf "ratio of %f", $matches / ($len - $matches);

出力: 1.333333 の比率

于 2012-08-14T13:49:08.547 に答える
0

一般に、コードを投稿してください。それは役に立ちます。いずれにせよ、このようなものはあなたが求めていることをするはずです:

#!/usr/bin/perl -w
use strict;
my $d1='ATCGTAC';
my $d2='TACGAAC';

my @dna1=split(//,$d1);
my @dna2=split(//,$d2);

my $matches=0;
for (my $i=0; $i<=$#dna1; $i++) {
    $matches++ if $dna1[$i] eq $dna2[$i];
}
my $mis=scalar(@dna1)-$matches;
print "Matches/Mismatches: $matches/$mis\n";

ただし、4 対 3 の比率は4.3 ではなく~1.3 であることに注意してください。入力ファイル形式に関する情報を投稿すると、ファイルからシーケンスを解析するための行を含めるように回答を更新します。

于 2012-08-14T02:02:20.630 に答える
0

文字列の 1 つの長さを取得し (文字列の長さは等しいと想定していますよね?)、 を使用して反復しsubstrます。

my @strings = ( 'ATCGTAC', 'TACGAAC' );

my $matched;
foreach my $ix ( 0 .. length( $strings[0] ) - 1 ) {
  $matched++
    if   substr( $strings[0], $ix, 1 ) eq substr( $strings[1], $ix, 1 );
}

print "Matches: $matched\n";
print "Mismatches: ", length( $strings[0] ) - $matched, "\n";
于 2012-08-14T02:09:03.497 に答える
0

通常、「何を試しましたか」と「最初にコードをアップロードしてください」と言うのは、それほど難しい問題ではないように思われるからです。しかし、これを試してみましょう:

2 つの配列を作成し、1 つは各シーケンスを保持します。

@sequenceOne = ("A", "T", "C", "G", "T", "A", "C");
@sequenceTwo = ("T", "A", "C", "G", "A", "A", "C");
$myMatch = 0;
$myMissMatch = 0;

for ($i = 0; $i < @sequenceOne; $i++) {
    my $output = "Comparing " . $sequenceOne[$i] . " <=> " . $sequenceTwo[$i];
    if ($sequenceOne[$i] eq $sequenceTwo[$i]) {
        $output .= " MATCH\n";
        $myMatch++;
    } else {
        $myMissMatch++;
        $output .= "\n";
    }
    print $output;
}

print "You have " . $myMatch . " matches.\n";
print "You have " . $myMissMatch . " mismatches\n";
print "The ratio of hits to misses is " . $myMatch . ":" . $myMissMatch . ".\n";

もちろん、配列をハードコーディングするのではなく、その場で別のものからシーケンスを読み取りたいと思うでしょう。しかし、あなたはその考えを理解します。上記のコードを使用すると、出力は次のようになります。

torgis-MacBook-Pro:platform-tools torgis$ ./dna.pl 
Comparing A <=> T
Comparing T <=> A
Comparing C <=> C MATCH
Comparing G <=> G MATCH
Comparing T <=> A
Comparing A <=> A MATCH
Comparing C <=> C MATCH
You have 4 matches.
You have 3 mismatches
The ratio of hits to misses is 4:3.
于 2012-08-14T02:09:59.783 に答える
0

これを行う方法はたくさんあります。これが1つです。

use strict;
use warnings;

my $seq1 = "ATCGTAC";
my $seq2 = "TACGAAC";

my $len = length $seq1;
my $matches = 0;

for my $i (0..$len-1) {
    $matches++ if substr($seq1, $i, 1) eq substr($seq2, $i, 1);
}

printf "Length: %d  Matches: %d  Ratio: %5.3f\n", $len, $matches, $matches/$len;

exit 0;
于 2012-08-14T02:10:42.890 に答える
0

substr文字列を配列に分割するのではなく、進むべき道だと思います。

サブルーチンとして提示された場合、これはおそらく最も便利です。

use strict;
use warnings;

print ratio(qw/ ATCGTAC TACGAAC /);

sub ratio {

  my ($aa, $bb) = @_;
  my $total = length $aa;
  my $matches = 0;
  for (0 .. $total-1) {
    $matches++ if substr($aa, $_, 1) eq substr($bb, $_, 1);
  }

  $matches / ($total - $matches);
}

出力

1.33333333333333
于 2012-08-14T03:11:32.843 に答える