data.txt
2개의 열과 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
!