使用 awk 计算数据子集列的平均值和方差

使用 awk 计算数据子集列的平均值和方差

我想在用另一列过滤数据集后计算该列的平均值和方差。例如,使用数据集:

0 1
0 2
0 3
0 4
0 5
1 1
1 2
1 3
1 4
1 5
2 1
2 2
2 3
2 4
2 5

我想要的结果:

0 3 2.5
1 3 2.5
2 3 2.5

其中第一列为分类变量,第二列和第三列为平均值和方差。

你能帮助我吗?提前谢谢。

答案1

使用韦尔福德 (Welford) 计算方差的方法并假设方差非零(即每个类别都有多个实例):

awk '
  {count[$1]++; sum[$1]+=$2; sumsq[$1]+=$2*$2} 
  END {
    for(i in count) {m = sum[i]/count[i]; print i, m, (sumsq[i] - count[i]*m**2)/(count[i]-1)}
  }
' dataset
0 3 2.5
1 3 2.5
2 3 2.5

捕获零方差情况留作练习。

答案2

您可以使用GNU 数据聚合

datamash -W -g 1 mean 2 svar 2 < file

解释:

  • -W使用空格作为分隔符
  • -g 1按字段 1 分组
  • mean 2打印字段 2 的平均值
  • svar 2打印字段 2 的样本方差

查看更多操作这里


安装datamash方式apt

sudo apt install datamash

相关内容