6.1 perl--针对不同的列求平均值
test文件
0 1
0 2
1 2
1 1
1 3
1 2
2 1
2 4
2 3
3 4
3 5
3 7
方法1: 用R
用R的话就两行:
data = read.table('file')
tapply(data[, 2], data[, 1], mean) #详尽的功能介绍在r博客分类中提到
结果为:
> tapply(data[, 2], data[, 1], mean,simplify = TRUE)
0 1 2 3
1.500000 2.000000 2.666667 5.333333
> tapply(data[, 2], data[, 1], mean,simplify = FALSE)
$`0`
[1] 1.5
$`1`
[1] 2
$`2`
[1] 2.666667
$`3`
[1] 5.333333
方法2:用perl (一哥们帮忙写的一个脚本:test.perl3)
#! /usr/bin/perl -w
use strict;
die "perl $0 test \n" unless @ARGV==1;
my $file=shift;
open IN,$file||die;
my %hash;
map{my @p=split;$hash{$p[0]}{$_}=$p[1]}<>; #<>里面还有一个IN,如果加到括号里面就不显示了。
close IN;
foreach my $k(sort keys%hash){
my $count=0;
my $sum=0;
foreach my $v(sort keys %{$hash{$k}}){
$count++;
$sum+=$hash{$k}{$v};
}
my@mean=sprintf "%.4f",$sum/$count;
print "$k\t",$mean,"\n";
}
Ps:不觉其厉啊,尽管哈希这一块双循环没有看明白
这里是一个广告位,,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn