欠落しているデータを確認したときに同じIDを持つすべての行の列の平均値

欠落しているデータを確認したときに同じIDを持つすべての行の列の平均値

統計とマッピングのための表現型ファイルを準備するために小さなbashコードを書こうとしています。私の目標は、次の性質のファイルから同じPLOT番号のWD列値の平均を取得することです。

PLOT BLOC NAME CANE# WD
1001 1 A 1 38.8889
1001 1 A 2 33.3333
1001 1 A 3 
1002 1 B 1 
1002 1 B 2 
1002 1 B 3 
1003 1 C 1 63.1579
1003 2 C 2 95
1003 1 C 3 
[...]

最初のアプローチは、プロットとWD列のみが保存される新しいファイルを作成し、WDデータが欠落しているすべての行を削除してから数式を適用することでした。awk '{seen[$1]+=$2; count[$1]++} END{for (x in seen)print x, seen[x]/count[x]}' input > output

良い結果。ただし、この場合、「欠けているデータ」を表示したいプロットの一部が出力ファイルから完全に欠落しています(例のプロット1002など)。

欠落しているデータを維持し、平均を考慮しながら、同様の出力を取得する方法を知りたいです。実際に数回試しましたが、間違った結果を得ました。たとえば、グラフ1001の場合、平均値は36ではなく24でした(3番目のデータポイントが欠けているため、0と見なされるべきではありません)。また、ソースファイルにコマンドを適用して、列ブロックと名前を保存するのにも役立ちます。

#Create a file WD with only plot and WD column 
# Delete missing values (Stems that did not exist, for which measurements were not collected)
awk '$2!=""' WD.txt > WD1.txt
# Average WD for each plot
awk '{seen[$1]+=$2; count[$1]++} END{for (x in seen)print x, seen[x]/count[x]}' WD.txt > WD1.txt
sed -i '1d' WD1.txt
sed -i '1i PLOT WD%' WD1.txt

ご協力ありがとうございます。氏

答え1

WDフィールドが空でない場合にのみ数を追加できます。

$ awk '
    NR>1 {sum[$1] += $5; count[$1] += $5=="" ? 0 : 1} 
    END {for (i in sum) print i, (count[i] > 0 ? sum[i]/count[i] : "-")}
  ' WD.txt
1001 36.1111
1002 -
1003 79.0789

車輪を再発明したくない場合は、次のものを使用できます。ミラーstats1希望の方法で空のフィールドを処理するようです。

$ mlr --pprint stats1 -g PLOT -a mean -f WD WD.txt 
PLOT WD_mean
1001 36.111100
1002 -
1003 79.078950

MillerバージョンのUbuntuはuniverseリポジトリで利用可能です。

関連情報