【问题标题】:Getting average per line平均每行
【发布时间】:2013-11-14 17:12:45
【问题描述】:

我有一个这种格式的大型数据集

HF TLLL A T 0.999 NA 0.666 NA 0.566 NA NA 0.87
HF TLLM A T 0.500 0.500 0.666 0.566 NA NA 0.87

我想计算每行的平均值,从第 5 列开始到行尾,忽略字符串 NA。然后将平均值附加到每行的末尾。

输出如下所示:

HF TLLL A T 0.999 NA 0.666 NA 0.566 NA NA 0.87 0.775
HF TLLM A T 0.500 0.500 0.666 0.566 NA NA 0.87 0.620

我一直得到这样的总和,但不知道如何跟踪求和的整数数,以计算平均值。

awk '{x=0;for(i=5;i<=NF;i++)x=x+$i;print $0, x}'

【问题讨论】:

  • 我假设average,您的意思是算术平均数。 “NA”算作零数据点,还是完全忽略?这将影响每行数据点的数量,从而影响计算的平均值。
  • 是的,我的意思是算术平均值。 NA 应该被完全忽略。
  • 我想知道你为什么在这个问题上被否决了。您有样本输入、预期输出、映射解释和尝试的解决方案。据我所知,这只是一个完美的问题!
  • 有人对这篇文章投了反对票。很高兴知道为什么。帖子写得很好,输入数据,预期输出,并尝试解决它。所以我投了赞成票。编辑:@EdMorton 你打败了我几秒钟 :)
  • @Jotne 赞一个好主意,我现在也这样做了。

标签: awk average


【解决方案1】:
$ cat file
HF TLLL A T 0.999 NA 0.666 NA 0.566 NA NA 0.87
HF TLLM A T 0.500 0.500 0.666 0.566 NA NA 0.87
HF TLLM A T NA NA NA NA NA NA NA

$ awk '{sum=cnt=0; for (i=5;i<=NF;i++) if ($i != "NA") { sum+=$i; cnt++ } print $0, (cnt ? sum/cnt : "NA") }' file
HF TLLL A T 0.999 NA 0.666 NA 0.566 NA NA 0.87 0.77525
HF TLLM A T 0.500 0.500 0.666 0.566 NA NA 0.87 0.6204
HF TLLM A T NA NA NA NA NA NA NA NA

三元表达式可避免输入第 3 行出现除以零错误,其中每个数据字段均为“NA”。

【讨论】:

  • +1 表示0/0 检查。写s=n=0的时候就想到了这个,但是printf的时候忘记了...
【解决方案2】:
kent$  awk '{s=n=0;for(i=5;i<=NF;i++)if($i!="NA"){s+=$i*1;n++}printf "%s %.3f\n",$0,s/n}' file
HF TLLL A T 0.999 NA 0.666 NA 0.566 NA NA 0.87 0.775
HF TLLM A T 0.500 0.500 0.666 0.566 NA NA 0.87 0.620

【讨论】:

    【解决方案3】:

    使用awk,您可以这样做:

    awk '{for (i=5;i<=NF;i++) {if ($i!="NA") t++;a+=$i}print $0,a/t;a=t=0}' file
    HF TLLL A T 0.999 NA 0.666 NA 0.566 NA NA 0.87 0.77525
    HF TLLM A T 0.500 0.500 0.666 0.566 NA NA 0.87 0.6204
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多