Como calcular a maioria (ponderada) sobre as colunas?

3

Eu tenho dois arquivos: o primeiro contém linhas em que a primeira coluna é um ID e as colunas restantes são votadas, por exemplo,

3242 -1 1 -1 1 1 1

Em uma primeira etapa, quero calcular a maioria dos IDs. Para o exemplo acima, a votação é 1 (já que há mais votos positivos do que negativos). Eu gostaria de armazenar os resultados em um arquivo de saída com linhas como

3242 1

Eu também tenho um arquivo que contém os "pesos" dos respectivos votos, por exemplo

3242 0.9 0.1 0.9 0.2 0.1 0.2

Em uma segunda etapa, também quero calcular os votos ponderados para as diferentes linhas. Nesse caso, isso seria

(0.9 * -1) + (0.1 * 1) + (0.9 * -1) + (0.2 * 1) + (0.1 * 1) + (0.2 * 1) = -1.2

O resultado é negativo, então o voto deve ser -1. Mais uma vez, gostaria de armazenar isso em um arquivo de saída, onde cada linha contém o ID e a votação resultante.

Isso seria possível com awk, perl, ...?

    
por MaVe 15.11.2013 / 10:03

1 resposta

1
#!/usr/bin/perl

use List::MoreUtils qw(pairwise);
use List::Util qw(sum);
use strict;

sub read_file {
    my ($filename) = @_;
    open F, '<', $filename or die "Could not open $filename: $!";
    my %data;
    while (<F>) {
        my ($id, @data) = split;
        $data{$id} = \@data;
    }
    close F;
    return %data;
}

sub output_file {
    my ($filename, %data) = @_;
    open F, '>', $filename or die "Could not open $filename: $!";
    for (sort keys %data) {
        print F "$_\t$data{$_}\n";
    }
    close F;
}

my %votes = read_file 'votes.tsv';
my %weights = read_file 'weights.tsv';

my %unweighted;
while (my ($id, $data) = each(%votes)) {
    my $sum = List::Util::sum(@$data);
    $unweighted{$id} = $sum < 0 ? -1 :
                       $sum > 0 ? +1 : 0;
}
output_file('unweighted.tsv', %unweighted);

my %weighted;
while (my ($id, $data) = each(%weights)) {
    my $dot_prod = sum(pairwise { $a * $b } @{$votes{$id}}, @$data);
    $weighted{$id} = $dot_prod < 0 ? -1 :
                     $dot_prod > 0 ? +1 : 0;
}
output_file('weighted.tsv', %weighted);
    
por 15.11.2013 / 11:00

Tags