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
、Pythonでそれを把握できるかどうか調べるためにこの文を一緒に書いています。
@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
出力の唯一の違いは、出力がソートされ()小数点以下の2桁にValue
丸められることです。Avg
このようなコンパクトなソリューションを書いてくれた@Kamarajにもう一度感謝しますawk
!