在做数据的时候通常会遇到这样的问题:第一列是标签,后面的列是值,将第一列随机重排,而后面不动,下面是这样做法的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";
}
}
|