我需要找到这种格式的大量数据的平均值和标准差。我尝试使用Excel,但似乎没有一种简单的方法来转置列。我在Excel中缺少什么,或者我应该只使用Perl?
输入文件格式为:
0 123
0 234
0 456
1 657
1 234
1 543
希望结果将平均值和标准偏差按第一列中的值分组:
0 AvgOfAllZeros StdDevOfALlZeros
1 AvgOfAllOnes StdDevOfAllOnes
答案 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)
答案 4 :(得分:0)
您是否尝试过使用Excel的AVERAGEIF功能?
答案 5 :(得分:0)
答案 6 :(得分:0)