如何获得按键分组的平均值和标准偏差?

时间:2009-09-11 19:57:27

标签: perl excel statistics

我需要找到这种格式的大量数据的平均值和标准差。我尝试使用Excel,但似乎没有一种简单的方法来转置列。我在Excel中缺少什么,或者我应该只使用Perl?

输入文件格式为:

0 123

0 234

0 456

1 657

1 234

1 543

希望结果将平均值和标准偏差按第一列中的值分组:

0 AvgOfAllZeros StdDevOfALlZeros

1 AvgOfAllOnes StdDevOfAllOnes

7 个答案:

答案 0 :(得分:3)

这在R中很容易做到。如果您的数据位于名为foo的文件中,那么此代码就可以解决问题:

> data <- read.table("foo")
> cbind(avg=with(data, tapply(V2, V1, mean)),
+       stddev=with(data, tapply(V2, V1, sd)))
  avg   stddev
0 271 169.5553
1 478 218.8630

答案 1 :(得分:2)

裂缝的指关节

使用Statistics::Descriptive CPAN模块,你可以用它来获取它:

use strict;
use warnings;
use Statistics::Descriptive;

my ($file) = @ARGV;

my @zeroes;
my @ones;

# Reading it in
open my $fh, '<', $file or die "unable to open '$file', $!";

while (my $line = <$fh>)
{
   chomp $line;
   my ($value, $number) = split("\s+", $line);
   if ($value)
   {
      push @ones, $number;
   }
   else
   {
      push @zeroes, $number;
   }
}
close $fh or warn "Can't close fh! $!";

# Stat processing
$stat_zeroes   = Statistics::Descriptive::Full->new();
$stat_ones     = Statistics::Descriptive::Full->new();

$stat_zeroes->add_data(@zeroes);
$stat_ones->add_data(@ones);

print "0: ", $stat_zeroes->mean(), " ", $stat_zeroes->standard_deviation(), "\n",
      "1: ", $stat_ones->mean(), " ", $stat_zeroes->standard_deviation(), "\n";

答案 2 :(得分:2)

如果在Excel中手动执行此操作,则可以复制数据,然后使用“选择性粘贴”菜单粘贴它。那里有一个转置复选框。

如果您更频繁地这样做,这里是一个Perl脚本。内存复杂度与输出的大小成线性关系,因此在仅有两行的情况下保持不变:

#!/usr/bin/perl

while (<>) {
    my ($x, $y) = split;
    $sum{$x} += $y;
    $count{$x}++;
    $sumSq{$x} += $y * $y;
}

for $i (sort keys %sum) {
    $stdev = sqrt(($sumSq{$i} - $sum{$i} * $sum{$i} / $count{$i}) / ($count{$i} - 1));
    print $i, " ", $sum{$i}/$count{$i}, " ", $stdev, "\n";
}

答案 3 :(得分:1)

可以使用Excel。 AVERAGEIF 功能但 STDEV 没有类似功能,因此需要备用两步法。

通过在右侧添加两个带有公式的列,可以“转置”数据。假设您的数据位于A列和B列,则C列中的公式为;

=IF(A2=0,B2,"")

在D栏中,它将是;

=IF(A2=1,B2,"")

然后新列可以将公式添加到底部

表示平均值

=AVERAGE(C2:C7)

对于StdDev

=STDEV(C2:C7)

Excel standard deviation

答案 4 :(得分:0)

您是否尝试过使用Excel的AVERAGEIF功能?

答案 5 :(得分:0)

如果您处理大量数据,那么您应该考虑PDL ... Perl数据语言。

请参阅this相关的SO答案。

答案 6 :(得分:0)

我会使用SUMIF和COUNTIF公式。您必须添加额外的一列或两列来获得平方偏差才能计算出标准偏差。一个例子看起来像这样

alt text

使用B10中的公式 = SUMIF($ A $ 2:$ A $ 7, “=” &安培; A10,$ B $ 2:$ B $ 7)/ COUNTIF($ A $ 2:$ A $ 7, “=” &安培; A10) 在B11 = SQRT(SUMIF($ A $ 2:$ A $ 7, “=” &安培; A10,$ d $ 2:$ d $ 7)/ COUNTIF($ A $ 2:$ A $ 7, “=” &安培; A10))