我怎样才能得到按键分组的平均值和标准差?

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

input文件格式是:

0 123

0 234

0 456

1 657

1 234

1 543

想要结果按照第一列中的值对平均值和标准差进行分组:

0 AvgOfAllZeros StdDevOfALlZeros

1 AvgOfAllOnes StdDevOfAllOnes

这在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 

裂纹的指关节

使用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"; 

如果您在Excel中手动执行此操作,则可以复制数据,然后使用“粘贴特殊”菜单选项将其粘贴。 那里有一个转置checkbox。

如果你更频繁地这样做是一个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"; } 

Excel可以使用。 有一个AVERAGEIF函数但STDEV没有类似的,所以需要一个替代的两步法。

数据可以通过在右侧添加具有公式的两列来“转置”。 假设你的数据在列A和B中,列C中的公式是;

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

在D列将是;

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

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

平均

 =AVERAGE(C2:C7) 

而对于StdDev

 =STDEV(C2:C7) 

Excel标准偏差

你有没有尝试过使用Excel的AVERAGEIF函数?

我将使用SUMIF和COUNTIF公式。 你将不得不添加一两列来获得平方偏差,以便找出标准偏差。 一个例子是这样的

替代文字http://img34.imageshack.us/img34/4291/image1xh.th.png

在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))

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

看到这个相关的答案。