Arrays 距阵列的编辑距离百分比
我试图从一组序列中获取编辑距离的百分比。到目前为止,这就是我所拥有的:Arrays 距阵列的编辑距离百分比,arrays,perl,loops,bioinformatics,edit-distance,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---------
#!/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
的字母获得编辑距离和每个序列的长度。如果打印,结果如下所示:
@距离
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
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
干得好。顺便说一句,在带有正则表达式的行中添加类似于
#/
的注释将关闭文章其余部分的错误语法突出显示。有时你不得不使用它,这取决于正则表达式中的设置。在这里,我希望#/
能做到这一点。@zdim谢谢。stackexchange.com使用。如果您愿意,我们可以尝试使用Perl语法高亮显示解决一些问题,以便(似乎我们需要用Javascript编写修补程序:)在挪威过一个愉快的圣诞节。感谢您的良好祝愿。我可能在俄勒冈州的一座山上瞥见了挪威,那里有雪足,阳光充足。(但不知怎么的,我觉得20华氏度太暖和了?)我希望你有一个愉快的假期。这是一个非常好的主意,实际上是为了解决问题!(我不知道怎么做。)至于JS,这将是我最终进入它的一个机会。@zdim嗨zdim。实际上,挪威的气候变化很大。我住在西海岸的卑尔根,这里不那么冷:)我从未去过俄勒冈州,但15年前我去过加利福尼亚。。。无论如何,我创建了一个谷歌代码美化GitHub库的分支。让我们继续讨论。再见。