用perl统计一个六种类型的数据


 rebecca 童鞋还是第一次问我数据处理的问题阿。其实我对这种问题是比较感兴趣的。

数据是这样子的。

例子文件,只取了一小部分数据:get2_nr.out

ZM_BFa0062B01	bzip
ZM_BFa0063A16	bzip
ZM_BFa0063M13	myc
ZM_BFa0063N22	myc
ZM_BFa0063O17	bzip
ZM_BFa0066C13	myb
ZM_BFa0066F21	bzip
ZM_BFa0068F07	bzip
ZM_BFa0068F15	myb
ZM_BFa0068N18	myb
ZM_BFa0068P14	bzip
ZM_BFa0069B08	myb
ZM_BFa0070G13	myb
ZM_BFa0071G19	bzip
ZM_BFa0071G21	myb
ZM_BFa0072O19	bzip
ZM_BFa0073F20	myb
ZM_BFa0073F20	myc
ZM_BFa0073O09	myb
ZM_BFa0073O09	myc
ZM_BFa0078K13	dre
ZM_BFa0078M22	bzip
ZM_BFa0079N03	erf
ZM_BFa0079P04	erf
ZM_BFa0083F19	myb
ZM_BFa0086H17	myb
ZM_BFa0087C10	bzip
ZM_BFa0090M23	bzip
ZM_BFa0090M23	erf
ZM_BFa0090M23	myc
ZM_BFa0097N21	bzip
ZM_BFa0098A07	erf
ZM_BFb0001A15	bzip
ZM_BFb0001A21	abf
ZM_BFb0001A21	erf
ZM_BFb0001A22	bzip
ZM_BFb0001B09	bzip
ZM_BFb0001B09	erf
ZM_BFb0001B13	bzip

Rebecca给出的分析是这样子的:

第一列是基因名称,第二列是转录因子

同一个基因可能有几类转录因子的结合位点,因此,统计不同的情况

  • 1. 一个基因只有一个转录因子,且这个转录因子是bzip。同理,统计,myb,myc,erf,abf,dre,6种情况
  • 2. 一个基因有2个转录因子,那么就可能是6个中任意2个的组合,15种情况
  • 3.一个基因上有3个转录因子,就是6个中任意三个,20种情况
  • 4.一个基因上有4个转录因子,就是15种
  • 5.一个基因上有5个转录因子,6种情况

如果枚举的话,貌似太多了

输出的结果是:直接的每种类型的基因个数就行了(即类型-》个数)

例子代码:temp.pl

#!/usr/bin/perl

while(<>){
	chop;
	($id,$type) = split("\t");
	chop($type);  #要用两次chop才能把换行符去掉。奇异。。(较旧的perl版本可能得改为chomp($type);)
	$gene{$id} .= $type . "\t"; #丢给hash了
}

undef @arr;
foreach $id (sort keys %gene) {
	@type = sort(split("\t", $gene{$id})); #把type变为数组。用sort函数。避免不必要的重复
	$type = join("-",@type);
	push (@arr,$type); #再把所有的type丢进一个数组里
}

$hash{$_}++ for @arr; #从type的数组里统计重复和个数
print "$_\t$hash{$_}\n" for (keys %hash); #输出

如果按Rebecca的思路枚举的话。的确是需要更加的代码来完成。

幸好最后还是想出了这样一个用hash来完成的办法。也算是可喜,最主要的参考还是  perl语言编程 里的一段代码。求平均值的。也有着类似的求解过程。


28条回应:“用perl统计一个六种类型的数据”

  1. Hash,真的好有用。我昨天看一个脚本,用hash,一下在清楚了。

  2. 没有正确答复或连接的主机没有反应,连接错误:超出内存(分配17301504)(尝试分配122880字节)/家庭/ yunim的/柳城/可湿性粉剂/资产净值的菜单的template.php上线224
    你看下你的站点日志。冒似有点问题