我需要找出这种格式的大量数据的平均值和标准差。我尝试使用Excel,但似乎没有一种简单的方法来转置列。我在Excel中遗漏了什么,还是应该只使用Perl?
输入文件格式为:
0 123
0 234
0 456
1657
1234
1543
希望结果根据第一列中的值对平均值和标准差进行分组:
0 AvgOfAllZeros StdDevOfALlZeros
1个AvgOfAllOnes StdDevOfAllOnes
发布于 2009-09-11 14:38:07
在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
发布于 2009-09-11 12:07:15
裂缝的指节
使用 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";
发布于 2009-09-13 12:04:22
如果在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";
}
https://stackoverflow.com/questions/1412970
复制相似问题