Как я могу получить средние и стандартные отклонения, сгруппированные по ключу? - PullRequest
2 голосов
/ 11 сентября 2009

Мне нужно найти среднее и стандартное отклонение большого количества данных в этом формате. Я пытался использовать Excel, но, похоже, нет простого способа транспонировать столбцы. Чего мне не хватает в Excel или мне просто использовать Perl?

Формат входного файла:

0 123

0 234

0 456

1 657

1 234

1 543

Требуется результат, чтобы сгруппировать средние и стандартные отклонения по значениям в первом столбце:

0 AvgOfAllZeros StdDevOfALlZeros

1 AvgOfAllOnes StdDevOfAllOnes

Ответы [ 7 ]

3 голосов
/ 12 сентября 2009

Это легко сделать в 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
2 голосов
/ 14 сентября 2009

Если вы делаете это вручную в 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";
}
2 голосов
/ 12 сентября 2009

трещина костяшек

используя модуль 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";
1 голос
/ 14 сентября 2009

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

0 голосов
/ 15 сентября 2009

Я бы использовал формулы SUMIF и COUNTIF. Вы должны добавить дополнительный столбец или два, чтобы получить квадрат отклонений, чтобы выяснить стандартное отклонение. Один пример выглядит так

alt text

с формулой в B10 = СУММЕСЛИ ($ A $ 2: $ A $ 7, "=" & А10, $ B $ 2: $ B $ 7) / СЧЕТЕСЛИ ($ A $ 2: $ A $ 7, "=" & A10) и в B11 = SQRT (SUMIF ($ A $ 2: $ A $ 7, "=" & А10, $ D $ 2: $ D $ 7) / СЧЕТЕСЛИ ($ A $ 2: $ A $ 7, "=" & А10))

0 голосов
/ 12 сентября 2009

Если вы имеете дело с большим набором данных, вам следует рассмотреть PDL ... Язык данных Perl.

См. этот связанный ответ SO.

0 голосов
/ 12 сентября 2009

Вы пытались использовать функцию AVERAGEIF в Excel?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...