找回密码
 注册
查看: 6146|回复: 3

做随机扰动,第一列标签随机重排perl程序(permutation)

[复制链接]
发表于 2010-6-6 09:50:03 | 显示全部楼层 |阅读模式
在做数据的时候通常会遇到这样的问题:第一列是标签,后面的列是值,将第一列随机重排,而后面不动,下面是这样做法的perl程序:需修改1、矩阵行数,2、#矩阵列数,3、随机1000次,4、输入文件 5、输出文件:代码如下:
use strict;
use warnings;
my($i,$j,$k,$l,$randnum,$col,$randtimes,$num,$rand,$position1,%array1,$id2,$rs2,$allel,@array,@array3,@arrayfile);
$num=84;      #矩阵行数,修改为待处理矩阵的行数
$col=104;     #矩阵列数,修改为待处理矩阵的列数
$randtimes=1000;####随机1000次,修改为随机次数
for ($randnum=1;$randnum<$randtimes;$randnum++) {
   %array1={};
print "$randnum\n";
#产生矩阵行数个随机数
$i=0;
$rand=int(rand($num)+1);
$array[$i]=$rand;
$array1{$rand} += 1;
# print "$array[$i]\n";
   while($i<$num-1){
  $rand=int(rand($num)+1);
  if(exists $array1{$rand}){
     next;
   }else{
     $array1{$rand} += 1;
     $i=$i+1;
     $array[$i]=$rand;
    #   print "$array[$i]\n";
     }
   }
#读入文件形成矩阵array
open (MYFILE1,'D:\filename') or die '$!';    ######## 输入待permutation文件,修改地址为输入文文件地址
open OUT,"+>D:\\filename$randnum.txt";       ######### 输出一批文件,修改地址为输出地址,注意原地址的\,在双引号内要全部修改为为\\,并且$randnum这几个字符不要动,因为$randnum是为生成文件编序号的变量
while(<MYFILE1>){      #或while (defined($x=<MYFILE1>)){chomp($x);}
   chomp($_);
  @array3 = split/ /;   #文件分割
  push @arrayfile, [@array3]
}
#输出permutation后矩阵
for ($k=0;$k<$num;$k++){
   print "$k \n";
   print OUT "$arrayfile[$array[$k]-1][0] ";
     for  ($l=1;$l<=$col;$l++){
      print OUT "$arrayfile[$k][$l] ";
     }
      print OUT "\n";
}
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2024-11-23 18:17 , Processed in 0.033499 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表