Determinando médias, stdev, stderror e contagens de valores em uma lista

0

Eu tenho um arquivo de texto chamado data.txt que contém 2 colunas e 80.667 linhas. As primeiras 20 linhas são representativas de todas as linhas:

  Column A     Column B

ACKR1/CCRL2     12.66
ACKR1/CMKLR1    10.41
ACKR1/CXCR4     13.01
ACKR1/FZD5      10.72
ACKR1/GPR107    10.22
ACKR1/GPR137    10.73
ACKR1/GPR146    11.93
ACKR1/TAPT1     11.24
ACKR1/TPRA1     11.81
ACKR1/XPR1      10.01
ACKR2/ACKR3     9.36
ACKR2/ACKR3     10.48
ACKR2/ACKR3     11.08
ACKR2/ACKR3     11.11
ACKR2/ACKR3     11.38
ACKR2/ACKR3     11.73
ACKR2/ACKR3     12.97
ACKR2/ADGRA2    8.68
ACKR2/ADGRA2    9.03
ACKR2/ADGRA2    9.34

Como você pode ver, existem alguns valores duplicados na coluna A (por exemplo, ACKR2 / ACKR3, ACKR2 / ADGRA2). O que eu gostaria de fazer é criar outro arquivo results.txt que contenha a média, desvio padrão e erro padrão de valores exclusivos, e quantas vezes eles apareçam em data.txt . Por exemplo:

   Value         Avg    Stdev    StdErr    Count

ACKR1/CCRL2     12.66    -         -         1
ACKR1/CMKLR1    10.41    -         -         1
ACKR1/CXCR4     13.01    -         -         1
ACKR1/FZD5      10.72    -         -         1
ACKR1/GPR107    10.22    -         -         1
ACKR1/GPR137    10.73    -         -         1
ACKR1/GPR146    11.93    -         -         1
ACKR1/TAPT1     11.24    -         -         1 
ACKR1/TPRA1     11.81    -         -         1
ACKR1/XPR1      10.01    -         -         1
ACKR2/ACKR3     11.46   0.84      0.35       7
ACKR2/ADGRA2    8.69    0.33      0.19       3

Não estou muito atrasado em obter o desvio padrão e o erro padrão, mas seria bom ter pelo menos um.

Sou biólogo, portanto não sou muito experiente em escrever scripts unix. Eu realmente não tenho idéia por onde começar, qualquer ajuda seria apreciada. Desculpe se algo como isso foi respondido antes, eu procurei, mas não consegui encontrar nada.

Muito obrigado!

    
por DiscoA 22.11.2016 / 07:43

2 respostas

3

Não tenho certeza sobre o cálculo de Stdev e Sterr. mas usando esse método, você pode facilmente calcular isso

$ awk '{A[$1]++;B[$1]+=$2}END{print "Value\t\tAvg\tCount";for (i in A){print i"\t"B[i]/A[i]"\t"A[i]}}' input.txt
Value           Avg     Count
ACKR2/ADGRA2    9.01667 3
ACKR1/GPR107    10.22   1
ACKR1/XPR1      10.01   1
ACKR1/CMKLR1    10.41   1
ACKR1/CCRL2     12.66   1
ACKR1/GPR146    11.93   1
ACKR1/GPR137    10.73   1
ACKR1/CXCR4     13.01   1
ACKR2/ACKR3     11.1586 7
ACKR1/TPRA1     11.81   1
ACKR1/FZD5      10.72   1
ACKR1/TAPT1     11.24   1
awk '{
A[$1]++;B[$1]+=$2
}
END
{
print "Value\t\tAvg\tCount";
for (i in A)
{
print i"\t"B[i]/A[i]"\t"A[i]
}
}'  input.txt
    
por 22.11.2016 / 08:09
3

Desde que eu não tenho uma vida tinha algum tempo de sobra, e desde que (aparentemente) nunca chego a aprender awk corretamente, eu escrevi isso juntos para ver se eu seria capaz de resolvê-lo em Python.

Não tirar nada do awk do @Kamaraj (votei positivo).

#!/usr/bin/env python3

colDict = {}  

with open ("cols") as infile: # Open the file
    for line in infile: # Read line by line
        splitLine = line.split() # Split line into list
        if splitLine[0] not in colDict: # Is value _not_ already in dict?
            value = splitLine[0] # Create new value
            colDict[value] = {} # Create nested dict
            colDict[value]["Avg"] = float(splitLine[1]) # Insert 'avg' 
            colDict[value]["Count"] = 1 # Insert count
        else: # Value _is_ in dict
            colDict[value]["Avg"] += float(splitLine[1]) # Add 'avg' float value
            colDict[value]["Count"] += 1 # Increment counter

print("Value\t\tAvg\tCount")
for value in sorted(colDict):
    print("{0}\t{1:.2f}\t{2}".format(value, 
                              colDict[value]["Avg"]/colDict[value]["Count"],
                              colDict[value]["Count"]))

Após a execução:

./parseCols.py
Value           Avg     Count
ACKR1/CCRL2     12.66   1   
ACKR1/CMKLR1    10.41   1   
ACKR1/CXCR4     13.01   1   
ACKR1/FZD5      10.72   1   
ACKR1/GPR107    10.22   1   
ACKR1/GPR137    10.73   1   
ACKR1/GPR146    11.93   1   
ACKR1/TAPT1     11.24   1   
ACKR1/TPRA1     11.81   1   
ACKR1/XPR1      10.01   1   
ACKR2/ACKR3     11.16   7   
ACKR2/ADGRA2    9.02    3  

A única diferença na saída é que o meu é classificado (em Value ) e que eu arredondo o Avg em duas casas decimais.

novamente; crédito para @Kamaraj por escrever uma solução tão compacta em awk !

    
por 22.11.2016 / 13:51

Tags