首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在对随机位置进行分析后,从基因组中提取随机的子串

在对随机位置进行分析后,从基因组中提取随机的子串
EN

Stack Overflow用户
提问于 2014-11-12 23:22:09
回答 1查看 52关注 0票数 1

我想生成一个随机数列表,然后将它们与一个文件中的范围列表进行比较。如果一个数字位于其中一个范围内,我希望从另一个文件中的字符串中提取一个子字符串,并将它们全部打印出来。我希望在输出文件中恰好有749个随机子字符串。我组合了不同的代码,它输出了正确的数据,但不是正确的子字符串数量。我相信我应用的749的计数发生在最终的if规则之前,以检查它是否在范围内。我显然可以使用更大的计数,然后手动选择前749个,但是范围分析似乎是按数字对它们进行排序,所以我不会真正随机抽取样本。

编辑:我试图改变代码,以适应随机数字从文件1的每一行的范围,但我得到了一个巨大的输出(152000)行相同的子字符串,代码在底部。

如果有帮助,我将一些示例文件数据放在下面:

File1:

代码语言:javascript
运行
复制
517 1878 forward
2156 3289 forward
3670 3915 forward
3912 5024 forward
5037 6968 forward
7005 9674 forward

File2:

代码语言:javascript
运行
复制
>gi|385195117|emb|HE681097.1| Staphylococcus aureus subsp. aureus HO 5096 0412 complete genome
CGATTAAAGATAGAAATACACGATGCGAGCAATCAAATTTCATAACATCACCATGAGTTTGGTCCGAAGCATGAGTGTTTACAATGTTTGAATACCTTATACAGTTCTTATACATACCGATTAAAGATAGAAATACACGATGCGAGCAATCAAATTTCATAACATCACCATGAGTTTGGTCCGAAGCATGAGTGTTTACAATGTTTGAATACCTTATACAGTTCTTATACATACCGATTAAAGATAGAAATACACGATGCGAGCAATCAAATTTCATAACATCACCATGAGTTTGGTCCGAAGCATGAGTGTTTACAATGTTTGAATACCTTATACAGTTCTTATACATAC

代码:

代码语言:javascript
运行
复制
#!/usr/bin/perl

use strict;
use warnings;
use 5.010;
use autodie;

chdir '/Users/edwardtickle/Documents';

open my $fh, '<', 'CC22rangesCDS.txt';

my @file1;
while (<$fh>) {
push @file1, [ split ];
}

my $size       = 21;
my $count      = 749;
my $min_length = ( $count - 1 ) * ( 2 * $size - 1 ) + $size;

open my $out, '>', 'randomnumberoutput.txt';

open $fh, '<', 'EMRSA-15.fasta';

while (my $line = <$fh>) {
next unless $line =~ /^([ATCG]+)/;

my $genome = $1;

if ( $min_length > length $genome ) {
    warn "Line $., Genome too small:  Must be $min_length, not ", length($genome), "\n";
    next;
}

my @pos = ( 0 .. length($genome) - 1 - ( $size - 1 ) );

for ( 1 .. $count ) {
    my $index = int rand @pos;
    my $pos   = $pos[$index];

    my $min = $index - ( $size - 1 );
    $min = 0 if $min < 0;
    splice @pos, $min, $size + $index - $min;

    for my $file1 (@file1) {

    my $substring = substr ($genome, $pos, $size);

    if ( $pos >= $file1->[0] and $pos <= $file1->[1] ) {

    print $out "$substring\n";
            }
        }
    }
   }

无效代码:

代码语言:javascript
运行
复制
#!/usr/bin/perl

use strict;
use warnings;
use 5.010;
use autodie;

chdir '/Users/edwardtickle/Documents';

open my $fh, '<', 'CC22rangesCDS.txt';

my @file1;
while (<$fh>) {
push @file1, [ split ];
}

my $size       = 21;
my $count      = 749;

open my $out, '>', 'randomtestingoutput.txt';

open $fh, '<', 'EMRSA-15.fasta';

while (my $line = <$fh>) {
next unless $line =~ /^([ATCG]+)/;

my $genome = $1;

for my $file1 (@file1) {

my $range = ($file1->[1] - $file1->[0]);
my $minimum = $file1->[0];

my $position = int(rand($range)) + $minimum;

for ( 1 .. $count ) {

    my $substring = substr ($genome, $position, $size);

    print $out "$substring\n";
            }
        }
    }

我真的在努力解决这个问题,所以任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2014-11-13 17:26:41

您的第一行提到您想要生成随机数。您始终可以在要求的范围内生成随机数,而不是无限制地生成数并丢弃范围外的数。

使用rand()函数可以指定上限和下限。

如下所示:

代码语言:javascript
运行
复制
  #!/usr/bin/perl
  use strict;
  use warnings;

  my $range = 100;

  my $random_number = int(rand($range));

  print $random_number . "\n";

请参阅rand()函数手册here

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26890415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档