确认缺失数据时,具有相同 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 的情况下,我得到的平均值是 24,而不是 36(第三个数据点丢失,不应该被视为 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

感谢您的帮助。 C

答案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 可从universe存储库获取 Ubuntu 版本。

相关内容