como calcular o valor médio da coluna que possui o ID da linha?

1

Eu quero calcular o valor médio dos meus dados quando eles tiverem o mesmo ID (no meu caso específico, no mesmo dia, mas em um horário diferente do dia). Isso serve para calcular o valor médio diário dos meus dados a partir dos dados por hora / sub hora. Meus dados se parecem abaixo.

Date        hour        value 
06/21/1978  14:00:00    1
06/21/1978  15:00:00    2
06/21/1978  16:00:00    3
06/21/1978  17:00:00    4
06/21/1978  18:00:00    5
06/21/1978  19:00:00    6
06/21/1978  20:00:00    7
06/21/1978  21:00:00    7
06/21/1978  22:00:00    9
06/21/1978  23:00:00    10
06/22/1978  00:00:00    5
06/22/1978  01:00:00    5
06/22/1978  02:00:00    5
06/22/1978  03:00:00    7
06/22/1978  04:00:00    8
06/22/1978  05:00:00    9
06/22/1978  06:00:00    22
06/22/1978  07:00:00    56
06/22/1978  08:00:00    9
06/22/1978  09:00:00    12
06/22/1978  10:00:00    3
06/22/1978  11:00:00    5
06/22/1978  12:00:00    7

Eu quero que a saída seja

Date        value
06/21/1978  5.4
06/22/1978  11.7692307692
    
por AiB 05.09.2013 / 11:10

3 respostas

3

Isso é essencialmente o mesmo que a solução awk de Stephane, mas codificada em Perl. Isso preservará a ordem das datas:

perl -ane 'if($.==1){print "$F[0]\t$F[2]\n"; next}
           $k{$F[0]}+=$F[2]; $l{$F[0]}++; 
           END{print "$_\t",$k{$_}/$l{$_},"\n" for (sort keys(%k))}' data
    
por 05.09.2013 / 14:20
3
awk 'NR==1{print $1,$3; next}
    {v[$1]+=$3;n[$1]++}
    END{for (i in n) print i, v[i]/n[i]}'

O pedido não é garantido. Se a entrada em si for classificada por data, você poderá imprimir assim que a data mudar:

awk 'NR==1{print $1,$3; next}
    {if (n && $1 != l) {print l, v/n; n=0; v=0}
     v+=$3; n++; l=$1}
    END{if (n) print l, v/n}'
    
por 05.09.2013 / 11:48
1

Muito parecido com a solução de Stephane, exceto que ele tira proveito do PROCINFO["sorted_in"] do GNU awk para impor a travessia do array em ordem de data.

awk 'BEGIN{PROCINFO["sorted_in"]="@ind_str_asc"};
NR==1{print $1,$3; next};
{arr[$1]+=$3; ++arr2[$1]};
END{for (k in arr) print k, arr[k]/arr2[k]}' test.1 | column -t
    
por 05.09.2013 / 16:15