목록의 평균, 표준 편차, 표준 오류 및 값 개수 결정

목록의 평균, 표준 편차, 표준 오류 및 값 개수 결정

data.txt2개의 열과 80,667개의 행을 포함하는 라는 텍스트 파일이 있습니다 . 처음 20개 행은 모든 행을 나타냅니다.

  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

보시다시피 A열에 중복된 값이 있습니다(예: ACKR2/ACKR3, ACKR2/ADGRA2). 내가 원하는 것은 results.txt고유 값의 평균, 표준 편차 및 표준 오류와 그 위치를 포함하는 다른 파일을 만드는 것입니다 data.txt.

   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

표준편차와 표준오차는 단계별로 잘 안나오는데, 하나쯤은 얻어가면 좋을 것 같습니다.

저는 생물학자이므로 UNIX 스크립트를 작성하는 데 능숙하지 않습니다. 어디서부터 시작해야할지 모르겠습니다. 도움을 주시면 대단히 감사하겠습니다. 이전에 비슷한 질문에 대한 답변이 있었다면 죄송합니다. 검색했지만 아무것도 찾을 수 없습니다.

매우 감사합니다!

답변1

Stdev와 Sterr의 계산이 확실하지 않습니다. 하지만 이 방법을 사용하면 쉽게 계산할 수 있습니다.

$ 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

답변2

나는 여가 시간이 없고 (분명히) 그것을 제대로 배울 생각이 전혀 없기 때문에 awk, 파이썬에서 그것을 알아낼 수 있는지 알아보기 위해 이 글을 함께 쓰고 있습니다.

@Kamaraj로부터 아무것도 빼앗지 않습니다 awk(나는 그것에 투표했습니다).

#!/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"]))

실행 후:

./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  

출력의 유일한 차이점은 출력이 정렬되어( ) 소수점 이하 두 자리로 Value반올림된다는 점입니다.Avg

이렇게 컴팩트한 솔루션을 작성해주신 @Kamaraj에게 다시 한 번 감사드립니다 awk!

관련 정보