免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2393 | 回复: 5
打印 上一主题 下一主题

数据处理问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-14 11:18 |只看该作者 |倒序浏览
本帖最后由 lijie_perl 于 2011-11-14 11:24 编辑

半年前上过一个老师的生物信息课程,讲了一些perl知识,觉得它在处理符号数据方面有潜力~
现在遇到下列问题。
有很多样本,分别分到一个n*m(n行m列中)的矩阵中。手上的数据如下
  1. 样本 行号 列号
  2. 1        1        2
  3. 2        2        2
  4. 3        1        2
  5. 4        3        1
  6. 5        2        3
  7. 6        3        2
  8. 7        2        2
  9. 8        1        2
  10. 9        3        3
  11. 10        2        2
复制代码
此表有样本10个,第1个样本分到1行2列矩阵点上,第2个样本分到2行2列矩阵点上,.....等等。
现在想把它恢复到一个3*3的矩阵中。例如,1 行2列矩阵点分到样本1,3,8。
我就在对应矩阵的1 行2列处输出3(分到该点的样本个数),并在屏幕打印:4号矩阵点分到样本为:1,3,8

(其中“4”是这样得到的:(2-1)*3+1,即对于n*m矩阵, 处于第i行第j列点的位置为:(j-1)*n+i)

对于上面的例子,除了屏幕打印的内容外,恢复到矩阵的内容应该如下:

  1.         1        2        3
  2. 1        0        3        0
  3. 2        0        3        1
  4. 3        1        1        1
复制代码
其中第一行1  2  3为代表行1 2 3,第一列1  2  3为代表列1 2 3(行号列号也可以不输出的)。
其他的就为对应的输出数据。
例如1*1矩阵点处无样本,为0;1*2矩阵点处分到样本1,3,8,为3;...等等.
求帮忙~~

论坛徽章:
0
2 [报告]
发表于 2011-11-14 11:25 |只看该作者
看一下小骆驼就能轻松写出代码来,建议LZ先自己写。

论坛徽章:
0
3 [报告]
发表于 2011-11-14 23:02 |只看该作者
生物帝向来都是这么牛屄

论坛徽章:
0
4 [报告]
发表于 2011-11-16 00:09 |只看该作者
本帖最后由 lijie_perl 于 2011-11-16 11:04 编辑

回复 2# iamlimeng


在楼主建议下,狠狠看了小骆驼,不过用起来还有点一支半解。
写了一个程序如下:
  1. #!/usr/bin/perl -w
  2. use strict;

  3. my $row=3;
  4. my $column=3;
  5. my $hash = {};
  6. my %count;

  7. open (IN,"inputfile.txt");
  8. while ( <IN> )
  9. {
  10.                 if( m/\s?(\d+)\s+(\d+)\s+(\d+)/ ){
  11.                         my $index=($3-1)*$row+$2;
  12.                         push @{$hash->{$index}} ,$1;
  13.                         $count{$index}++;
  14.                 }        
  15. }
  16. close(IN);

  17. #统计每一个神经元上样本个数
  18. open (OUT,">outfile.txt");
  19. my %tmp;
  20. foreach my $keys (sort keys %$hash)
  21. {
  22.         my @tem= @{$hash->{$keys}};
  23.         print OUT "第$keys号神经元有样本$count{$keys}个:"," @tem  \n";
  24.         $tmp{$keys}=$count{$keys};
  25. }
  26. close(OUT);

  27. #矩阵格式转换       
  28. my $n;
  29. my @tmp1;
  30. for (my $i=1;$i<=$row;$i++){
  31.         for(my $j=1;$j<=$column;$j++){
  32.                   foreach my $k (sort keys %tmp){
  33.                                 $n=0;
  34.                                 next if ((($j-1)*$row+$i)!=$k);
  35.                                 if ((($j-1)*$row+$i)==$k){
  36.                                         $n=$tmp{$k};
  37.                                         last;
  38.                                 }
  39.                         }
  40.                 push @tmp1,$n;            
  41.                 }
  42.         print join "\t", @tmp1;
  43.         @tmp1=();
  44.         print "\n";
  45. }     
复制代码
有2点问题:
1)统计每一个神经元上样本个数输出是正确的。但是我想按样本数量的多少由大到小输出,即输出格式如下:
  1. 第4号神经元有样本3个: 1 3 8
  2. 第5号神经元有样本3个: 2 7 10   
  3. 第6号神经元有样本1个: 6  
  4. 第8号神经元有样本1个: 5
  5. 第3号神经元有样本1个: 4  
  6. 第9号神经元有样本1个: 9  
复制代码
2)矩阵格式转换输出也是正确的,但是效率有点慢。

请大家帮帮我,改一下我的程序吧~~~

谢谢了~~·

data文件.rar

1.22 KB, 下载次数: 32

论坛徽章:
0
5 [报告]
发表于 2011-11-16 13:13 |只看该作者
回复 4# lijie_perl


如果看小骆驼能写出你展示的代码,那已经相当不简单。

我帮你改了一下,希望能帮到你:
  1. #!/usr/bin/perl -w
  2. use strict;

  3. my $row=3;
  4. my $column=3;
  5. my %hash;
  6. my %hash_sort;
  7. my %count;

  8. open (IN,"inputfile.txt");
  9. while ( <IN> )
  10. {
  11.                 if( m/\s?(\d+)\s+(\d+)\s+(\d+)/ ){
  12.                         my $index=($3-1)*$row+$2;
  13.                         push(@{$hash{$index}},$1);
  14.                         $count{$index}++;
  15.                 }
  16. }
  17. close(IN);

  18. foreach (keys %count) {
  19.         push(@{$hash_sort{$count{$_}}},$_);
  20. }

  21. #统计每一个神经元上样本个数
  22. open (OUT,">outfile.txt");
  23. my %tmp;
  24. foreach my $value (sort {$b<=>$a} keys %hash_sort) {
  25.         foreach my $key (sort {$a<=>$b} @{$hash_sort{$value}}) {
  26.                  print "第$key号神经元有样本$value个:"," @{$hash{$key}}\n";
  27.                 print OUT "第$key号神经元有样本$value个:"," @{$hash{$key}}\n";
  28.          }
  29. }
  30. close(OUT);

  31. #矩阵格式转换
  32. open (OUT,">outfile1.txt");
  33. for my $x(1..$column){
  34.         my @line = ();
  35.         for my $y(1..$row){
  36.                  my $index=($y-1)*$row+$x;
  37.                  my $value = ($count{$index})?$count{$index}:0;
  38.                  push(@line,$value);
  39.         }
  40.          print OUT join("\t",@line),"\n";
  41. }
  42. close(OUT);

  43. <STDIN>;
复制代码

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00
6 [报告]
发表于 2011-11-16 14:58 |只看该作者
回复 5# iamlimeng


    顶楼上,本想帮楼主看看的,结果耽搁了没看完就走了...... 呃(标准马后炮..)

    楼主加油,楼主好样的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP