免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: bioinfor
打印 上一主题 下一主题

这样的程序perl能不能做? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2010-10-17 11:50 |只看该作者
珞水的大叔的程序很快很强大,我顶死你。

论坛徽章:
0
22 [报告]
发表于 2010-10-17 19:52 |只看该作者
回复 16# 珞水的大叔


    ok,了解了。多谢。我也对正则感兴趣,到时候跟你交流哈!

论坛徽章:
0
23 [报告]
发表于 2010-10-17 19:58 |只看该作者
回复 15# 珞水的大叔


    # for(@A_choose,@B){         
#         $m{$_}++ && $n{$_}++;
#     }      
#     say scalar keys %n;
# }

大叔的这段代码。我在最近帖子中看到有人用过。真是不错,又是并集又是交集,太神奇了。这个用的好,赞!

论坛徽章:
0
24 [报告]
发表于 2010-10-17 20:00 |只看该作者
my @A_choose = map{ $A[$_] } keys %rand;

大叔是不是这个就不用调用 rand随机函数了 ?

论坛徽章:
0
25 [报告]
发表于 2010-10-18 11:17 |只看该作者
回复 24# liyangole


    %rand里面存放的是随机后的不重复的结果,随机的是这段:
  1. while(scalar keys %rand < $yangbengeshu){
  2.         $rand{int(rand scalar @A)} = 0;
  3.     }
复制代码

论坛徽章:
0
26 [报告]
发表于 2010-10-19 11:25 |只看该作者
回复 25# 珞水的大叔


    多谢 ,看到了。

论坛徽章:
0
27 [报告]
发表于 2010-10-31 18:03 |只看该作者
大叔的这个程序在小样本的时候没看出问题,但到了大样本的时候似乎有些不对,如附件给的数据,当 $yangbengeshu = 3时,结果居然都是5或6,理论上应该是<=3的数值,不知问题出在哪里呢?
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use 5.010;


  5. my $yangbengeshu = 3;   #抽取样本个数

  6. my @A;
  7. open A,"<human_gene.txt";
  8. while(<A>){
  9.     chomp;
  10.     s/^\s+$//;
  11.     s/^\s+//;
  12.     s/\s+$//;
  13.     push @A,$_ if $_ ne '';
  14. }
  15. close A;

  16. if($yangbengeshu > scalar @A){
  17.     die "ERROR: 抽取样本个数大于总个数\n";
  18. }

  19. my @B;
  20. open B,"<targetgene.txt";
  21. while(<B>){
  22.     chomp;
  23.     s/^\s+$//;
  24.     s/^\s+//;
  25.     s/\s+$//;
  26.     push @B,(split /\s*\/\s*/,$_)  if $_ ne '';
  27. }
  28. close B;

  29. for(1 .. 1000){
  30.     my %rand = ();
  31.     while(scalar keys %rand < $yangbengeshu){
  32.         $rand{int(rand scalar @A)} = 0;
  33.     }
  34.     my @A_choose = map{ $A[$_] } keys %rand;
  35.     my (%m,%n);
  36.     for(@A_choose,@B){         
  37.         $m{$_}++ && $n{$_}++;
  38.     }      
  39.     say scalar keys %n;
  40. }
复制代码
结果是:
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
6
6
5
6
5
6
5
5
5
5
6
6
5
5
5
5
5
5
6
6
6
5
5
6
5
5
....

test_data.rar

44.72 KB, 下载次数: 9

论坛徽章:
0
28 [报告]
发表于 2010-11-04 12:20 |只看该作者
回复 27# bioinfor


    这是因为targetgene.txt中有重复样本
   程序改了一下,如下:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use 5.010;


  5. my $yangbengeshu = 3;   #抽取样本个数

  6. my (%A,@A);
  7. open A,"<human_gene.txt";
  8. while(<A>){
  9.     chomp;
  10.     s/^\s+$//;
  11.     s/^\s+//;
  12.     s/\s+$//;
  13.     $A{$_} = undef if $_ ne '';
  14. }
  15. close A;
  16. @A = keys %A;
  17. if($yangbengeshu > scalar @A){
  18.     die "ERROR: 抽取样本个数大于总个数\n";
  19. }

  20. my (%B,@B);
  21. open B,"<targetgene.txt";
  22. while(<B>){
  23.     chomp;
  24.     s/^\s+$//;
  25.     s/^\s+//;
  26.     s/\s+$//;
  27.     map {$B{$_} = undef} (split /\s*\/\s*/,$_)  if $_ ne '';
  28. }
  29. close B;
  30. @B = keys %B;

  31. for(1 .. 1000){
  32.     my %rand = ();
  33.     while(scalar keys %rand < $yangbengeshu){
  34.         $rand{int(rand scalar @A)} = 0;
  35.     }
  36.     my @A_choose = map{ $A[$_] } keys %rand;
  37.     my (%m,%n);
  38.     for(@A_choose,@B){         
  39.         $m{$_}++ && $n{$_}++;
  40.     }      
  41.     say scalar keys %n;
  42. }
复制代码

论坛徽章:
0
29 [报告]
发表于 2010-11-29 21:11 |只看该作者
谢谢大叔!程序很强大!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP