col1にデバイスがあり、col2に変数があり、col3に呼び出しがあります。この例には、17個のINSと3個のMタイプがあります。 17×3行がある可能性があります。しかし、一部は欠落しています。
INS1 M1 AA
INS2 M1 AA
INS3 M1 AA
INS4 M1 GG
INS5 M1 GG
INS6 M1 GG
INS7 M1 AA
INS8 M1 GG
INS9 M1 GG
INS10 M1 AA
INS11 M1 AA
INS12 M1 GG
INS13 M1 AA
INS14 M1 AA
INS15 M1 AA
INS1 M2 GG
INS3 M2 TT
INS4 M2 GG
INS5 M2 GG
INS6 M2 TT
INS7 M2 TT
INS8 M2 TT
INS9 M2 TT
INS10 M2 GG
INS11 M2 GG
INS14 M2 GG
INS15 M2 TT
INS1 M3 AA
INS2 M3 TT
INS3 M3 AA
INS4 M3 TT
INS5 M3 TT
INS7 M3 AA
INS8 M3 TT
INS9 M3 AA
INS10 M3 TT
INS15 M3 TT
この楽器が属するグループを含む別のルックアップファイルがあります。たとえば、INS(1、2、3、7、14、16、17)はグループ1に属します。
GR1 INS1
GR1 INS2
GR1 INS3
GR1 INS7
GR1 INS14
GR1 INS16
GR1 INS17
GR2 INS5
GR2 INS6
GR2 INS8
GR2 INS9
GR2 INS15
GR3 INS4
GR3 INS10
GR3 INS11
GR3 INS12
GR3 INS13
70%のしきい値を超えるほとんどのグループ通貨に基づいて失われた通貨を推定しようとしています。 (予想される行はアスタリスクで示されていますが、出力には必要ありません。)
グループ1内の同じM値の呼び出し頻度がAA = 80%(3/4)で、呼び出し頻度がGG = 20%(1/4)の場合、グループ1内のすべての欠落INSを80%のINSと見なします。できます。 AAの多数は70%の標準を満たします。
AAの頻度が66%(2/3)で、GGの頻度が33%(1/3)の場合、66%が70%のしきい値を満たさないため、AAと見積もりません。
INS1 M1 AA
INS2 M1 AA
INS3 M1 AA
INS4 M1 GG
INS5 M1 GG
INS6 M1 GG
INS7 M1 AA
INS8 M1 GG
INS9 M1 GG
INS10 M1 AA
INS11 M1 AA
INS12 M1 GG
INS13 M1 AA
INS14 M1 AA
INS15 M1 AA
**INS16 M1 AA
INS17 M1 AA**
INS1 M2 GG
INS3 M2 TT
INS4 M2 GG
INS5 M2 GG
INS6 M2 TT
INS7 M2 TT
INS8 M2 TT
INS9 M2 TT
INS10 M2 GG
INS11 M2 GG
**INS12 M2 GG
INS13 M2 GG**
INS14 M2 GG
INS15 M2 TT
INS1 M3 AA
INS2 M3 TT
INS3 M3 AA
INS4 M3 TT
INS5 M3 TT
**INS6 M3 TT**
INS7 M3 AA
INS8 M3 TT
INS9 M3 AA
INS10 M3 TT
**INS11 M3 TT
INS12 M3 TT
INS13 M3 TT
INS14 M3 AA**
INS15 M3 TT
**INS16 M3 AA
INS17 M3 AA**
たとえば、Grp1 M1(INS1、2、3、7、14)には、100%の頻度を持つ5つのAA呼び出しがあります。したがって、M1のINS16とINS17(これらは欠落しており、Grp 1に属するため)は、呼び出し頻度が70%より高いため、AAとして推論できます。
Grp1 M2の場合、GG(2/4)とTT(2/4)の両方の呼び出しは50%で行われたため、70%以上の信頼性を置き換えることはできませんでした。 Grp1 M2の場合、明確な多数の呼び出し(70%以上)がないため、INS2、16、17はまだありません。
awkまたはPerlでこれを達成する方法を案内してください。私が試した解決策は、データにグループを追加し、しきい値を確認するために最も高い呼び出しの頻度を見つけることでした。ハッシュ配列を使用すると少し失われます。
awk 'NR==FNR{a[$2]=$1;next} $1 in a { print $0 FS a[$1]}' groups data > tmp
awk '{count[$4 FS $1]++}END{for(j in count) print j":"count[j]}' tmp > tmp2
awk -F, '{if (a[$2]< $3)a[$2]=$3;}END{for(i in a){print i,a[i];}}' tmp2 > tmp3
答え1
これは1行のコードで読むのが複雑すぎるため、コメント付きのスクリプトは次のようgawk
になります。
#!/usr/bin/gawk -f
## Save the data in array data: data[M][INS]=dinucleotide
NR==FNR{
data[$2][$1]=$3;
next
}
## Save the groups in array groups: groups[GRN][INS]
{
groups[$1][$2]++
}
## Now that everything is stored in memory, analyze
END{
## Get averages: for each group
for(group in groups){
## For each INS in this group
for(ins in groups[group]){
## For each MN in the data file
for(m in data){
## If this INS had a value for this M
if(data[m][ins]){
## This counts the number of times this dinucleotide
## (data[m][ins]) was found in this M among the INSs
## of this group.
num[group][m][data[m][ins]]++
## My version of gawk doesn't seem to support
## length for multidimensional arrays, so this array
## only exists to count the number of Ms of this group.
len[group][m]++;
}
}
}
}
## Foreach group of the groups file
for(group in num){
## For each M of this group
for(m in num[group]){
## For each INS of this group
for(ins in groups[group]){
## If this INS has a value for this m in
## the data file, print it.
if(data[m][ins]){
printf "%-5s %s %s\n", ins,m,data[m][ins]
}
## If it doesn't, check if there's an nt at
## >=70% for this group and print that
else{
for(nt in num[group][m]){
if(num[group][m][nt]*100/len[group][m] >= 70){
printf "%-5s %s %s\n", ins,m,nt
}
}
}
}
}
}
}
ファイルをとして保存してfoo.awk
実行可能にし、chmod +x foo.awk
ファイルから実行します。
$ ./foo.awk data groups
INS1 M1 AA
INS2 M1 AA
INS14 M1 AA
INS3 M1 AA
INS16 M1 AA
INS17 M1 AA
INS7 M1 AA
INS1 M2 GG
INS14 M2 GG
INS3 M2 TT
INS7 M2 TT
INS1 M3 AA
INS2 M3 TT
INS14 M3 AA
INS3 M3 AA
INS16 M3 AA
INS17 M3 AA
INS7 M3 AA
INS9 M1 GG
INS15 M1 AA
INS5 M1 GG
INS6 M1 GG
INS8 M1 GG
INS9 M2 TT
INS15 M2 TT
INS5 M2 GG
INS6 M2 TT
INS8 M2 TT
INS9 M3 AA
INS15 M3 TT
INS5 M3 TT
INS6 M3 TT
INS8 M3 TT
INS10 M1 AA
INS11 M1 AA
INS12 M1 GG
INS13 M1 AA
INS4 M1 GG
INS10 M2 GG
INS11 M2 GG
INS12 M2 GG
INS13 M2 GG
INS4 M2 GG
INS10 M3 TT
INS11 M3 TT
INS12 M3 TT
INS13 M3 TT
INS4 M3 TT
この方法を使用するには、データセット全体(2つのファイル)をメモリにロードする必要があります。しかし、実際に解決策が見つかりませんでした。ケースの70%以上が存在するかどうかを知る前に、記事全体を読む必要があるからです。私が考えることができる唯一の別の方法は、ファイルを何度も処理することです。メモリへのロードに問題がある場合はお知らせください。他のオプションがあるかどうかを見てみましょう。