2010-11-24 2 views
0

안녕하세요. 데이터 목록이 많습니다. http://paste-it.net/public/y17027d/ 67859 행 × 10 열입니다. 여섯 번째 열에는 1에서 6까지의 Z 점수를 나타내는 값이 0.01 단위로 포함됩니다. 내가하고 싶은 것은 동일한 Z 점수 값을 가진 다른 모든 열 값을 합산하는 것이지만 현재 코드는 작동하지 않습니다.목록을 축소하고 perl에서 총계를 얻는 데 도움이 필요합니다.

지금은 값을 인쇄하지만 각 Z- 점수의 합계는 잘못되었습니다.

#! /usr/bin/perl 

use strict; 
use warnings; 
use POSIX; 
use Data::Dumper; 



my $input = $ARGV[0]; 
open (DATAFILE, $input) or die $!; 
open(OUT,">>"."final.output.txt"); 

my($line,$fMeasure,$filename,$recall,$precision,$z_score,$computer_calls,$johns_calls,$false_negatives,$false_positives,$true_positives,$count); 
$fMeasure=$filename=$recall=$precision=$z_score=$computer_calls=$johns_calls=$false_negatives=$false_positives=$true_positives=$count = 0; 




my %stats=(); 
my %zscore=(); 
while($line = <DATAFILE>){ 
    # Chop off new line character, skip the comments and empty lines.     
    chomp($line); 
    my @temp = split(/\t/, $line); 
    $true_positives = $temp[0]; 
    $false_positives = $temp[1]; 
    $false_negatives = $temp[2]; 
    $johns_calls = $temp[3]; 
    $computer_calls = $temp[4]; 
    $z_score = $temp[5]; 
    $fMeasure = $temp[6]; 
    $precision = $temp[7]; 
    $recall = $temp[8]; 
    $filename = $temp[9]; 
    $stats{$z_score}{$filename}[0] = $true_positives; 
    $stats{$z_score}{$filename}[1] = $false_positives; 
    $stats{$z_score}{$filename}[2] = $johns_calls; 
    $stats{$z_score}{$filename}[3] = $computer_calls; 
    $stats{$z_score}{$filename}[4] = $fMeasure; 
    $stats{$z_score}{$filename}[5] = $precision; 
    $stats{$z_score}{$filename}[6] = $recall; 
    $stats{$z_score}{$filename}[6] = $filename; 
    $zscore{$z_score}++; 

} 


my $false_positives_new = 0; 
my $true_positives_new = 0; 
my $johns_calls_new = 0; 
my $computer_calls_new = 0; 
my $file_name = 0; 


foreach $z_score (sort keys %stats) { 
foreach $filename(keys %{$stats{$z_score}}){ 
    my $tp = $stats{$z_score}{$filename}[0]; 
    my $fp = $stats{$z_score}{$filename}[1]; 
    my $jc = $stats{$z_score}{$filename}[2]; 
    my $cc = $stats{$z_score}{$filename}[3]; 
    my $fn = $stats{$z_score}{$filename}[6]; 
    #print "$z_score\t$jc\n"; 
    $false_positives_new = $false_positives + $fp; 
    $true_positives_new = $true_positives + $tp; 
    $johns_calls_new = $johns_calls + $jc; 
    $computer_calls_new = $computer_calls + $cc; 

    #print OUT "$fn\n"; 
} 

print OUT"$true_positives_new\t$false_positives_new\t$johns_calls_new\t$computer_calls_new\t$z_score \n"; 
$false_positives_new = 0; 
$true_positives_new = 0; 
$johns_calls_new = 0; 
$computer_calls_new = 0; 
$file_name = 0; 

} 



close(OUT); 
close (DATAFILE); 

내가 뭔가 잘못하고해야하지만 무엇을 알아낼 수 없습니다임을 알게 :
다음은 내 코드입니다. 어떤 도움이라도 대단히 감사하겠습니다. 고맙습니다.

+0

의 말하고 싶은 생각? –

+0

지금은 없지만 나중에 프로그램을 변경하고이를 요구할 것입니다. 그것은 비록 코드의 기능에 영향을 주어서는 안됩니다. – Alos

+0

어쨌든 복잡한 숫자가 데이터 집계에 어떤 영향을 미치는지 파악하는 데 어려움을 겪고 있습니다. –

답변

1

는 당신이`수학 :: Complex` 거기에서 무엇을 무엇

$false_positives_new = $false_positives_new + $fp; 
# etc. 

대신

$false_positives_new = $false_positives + $fp; 
+0

@ Alos : 이것이 해시 대신이 변수들을 계속 사용하기를 바랍니다. –

+0

@Sinan 아니오 이후 해시를 사용하도록 수정했습니다. 감사 – Alos

2

확인. pastebin에서 데이터를 가져올 수 있었고 다음 코드가 원하는대로 작동한다고 생각합니다.

#! /usr/bin/perl 

use strict; use warnings; 
use Data::Dumper; 

my ($input) = @ARGV; 
open my $DATAFILE, '<', $input 
    or die "Cannot open '$input': $!"; 

my @field_names = qw(
    fMeasure 
    recall 
    precision 
    z_score 
    computer_calls 
    johns_calls 
    false_negatives 
    false_positives 
    true_positives 
    count 
); 

my @track_fields = qw(
    false_positives 
    false_negatives 
    johns_calls 
    computer_calls 
); 

my (%stats, %by_zscore); 

while (my $line = <$DATAFILE>) { 
    last unless $line =~ /\S/; 
    chomp $line; 
    my @temp = split /\t/, $line; 
    my $filename = pop @temp; 

    my %fields; 
    @fields{ @field_names } = @temp; 

    my $z_score = $fields{z_score}; 

    $stats{ $z_score }{$filename} = \@temp; 

    for my $f (@track_fields) { 
     $by_zscore{$z_score}{ $f } += $fields{ $f }; 
    } 
} 

print Dumper \%by_zscore; 
관련 문제