arrays - 距数组的编辑距离百分比

标签 arrays perl loops bioinformatics edit-distance

我正在尝试从一组序列中获取编辑距离的百分比。到目前为止,这就是我所拥有的:

#!/usr/bin/perl -w
use strict;
use Text::Levenshtein qw(distance);

my @sequence = qw(CA--------W----------------------EKDRRTEAF---F------ 
CA--------W----------------------EKDRRTEAF---F------ 
CA--------S-------------------SLVFGQGDNIQY---F------  
RA--------S-------------------SLIYSP----LH---F------);


foreach my $list (@sequence){
    my @distance = distance($list, @sequence);
    my @length = $list =~ tr/[A-Z]///;
}

我可以根据带有@length的字母来获取带有@distance的编辑距离和每个序列的长度。如果打印结果如下:

@距离

0 0 13 14
0 0 13 14
13 13 0 11 
14 14 11 0

@length

13
13
16
12

由于@length的每一行都相当于@sequence的每一行,所以在比较这两行时我想使用最大的@length 获取百分比。因此,当第二个和第三个序列之间存在编辑距离时,它将使用 16 而不是 13 的长度来获取百分比。我认为需要发生的是仅调用 @length 数组的两个元素,并选择较大的一个,然后将其放入百分比中,可能使用 if 语句。

我知道这段代码是错误的,但这通常是我想要的想法:

foreach my  $list (@sequence){
        my @distance = distance($list, @sequence);      
        my @length = $list =~ tr/[A-Z]//;                # / syntax hilite fix

        foreach my $item(@distance){
                foreach @length {
                        my $num1 = if $length[0] >= $length[1];
                                 print "$item/$num1\n";
                        else my $num2 = $length[1] >= $length[0];
                                print "$item/$num2\n";
                }
        }
}

答案应该类似于下面的内容:

0  0 .8125  1.0769
0  0  .8125  1.0769
.8125  .8125  0  .6875
1.0769  1.0769  .6875  0

最佳答案

试试这个。总结一下:我们计算两对之间的编辑距离 字符串。对于每一对,我们想要确定距离的分数和最大字符数 (A-Z)。最大字符数为该对中两项的最大字符数。

use strict;
use warnings;

use Text::Levenshtein qw(distance);

my @sequence = qw(
        CA--------W----------------------EKDRRTEAF---F------
        CA--------W----------------------EKDRRTEAF---F------
        CA--------S-------------------SLVFGQGDNIQY---F------
        RA--------S-------------------SLIYSP----LH---F------
);

my @length = map { tr/[A-Z]// } @sequence;

for my $i (0..$#sequence) {
    my $list = $sequence[$i];
    my @distance = distance($list, @sequence);
    my $num1 = $length[$i];
    for my $j (0..$#distance) {
        my $item = $distance[$j];
        my $num2 = $length[$j];
        my $num = ( $num2 > $num1 ) ? $num2 : $num1;
        printf "%.4f ", $item/$num;
    }
    print "\n";
}

输出:

0.0000 0.0000 0.8125 1.0769 
0.0000 0.0000 0.8125 1.0769 
0.8125 0.8125 0.0000 0.6875 
1.0769 1.0769 0.6875 0.0000 

关于arrays - 距数组的编辑距离百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41047574/

相关文章:

javascript - AngularJS $http.get 检索 ng-data-repeat 指令不可用格式的数组

javascript - 单击按钮时如何生成一组数组而不消失第一个数组?

java - 嵌套循环无法正确迭代

Python while 循环减法

c - 为什么我会得到如此困惑的输出?

arrays - Scala - 创建指定长度的类型参数化数组

java - 如何构造一个包含多种数据类型值的字节数组?

windows - 如何转换 perl 中的语言? (Slack 和 VisualSVN 服务器)

c - 在C中: assigning variables when reading in a one-line text file

mysql - 在perl中运行多个sql脚本