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