【问题标题】:How to calculate median using jq?如何使用 jq 计算中位数?
【发布时间】:2020-11-12 18:04:32
【问题描述】:

如何使用 jq 计算数组的中位数 (P50)? jq 手册描述了如何计算平均值,但我想得到中位数。

算法:给定一个数字列表,对其进行排序。如果有奇数个条目,则选择中间的一个。如果条目数为偶数,则计算中间两个条目的平均值。

例子:

echo '[1,5,9,3]' | jq <ANSWER>  # should output 4, since it's the mean of 3 and 5
echo '[1,9,2]' | jq <ANSWER>  # should output 2, since it's the middle element
echo '[]' | jq <ANSWER>  # undefined

【问题讨论】:

    标签: json average jq median


    【解决方案1】:

    答案:

    sort |
      if length == 0 then null
      elif length % 2 == 0 then (.[length/2] + .[length/2-1])/2
      else .[length/2|floor] end
    

    这是指定算法的简单实现。

    【讨论】:

      【解决方案2】:

      这种方法利用了这样一个事实,即数组的中心(按元素可以是“中间一个”或“中间两个”)根据定义始终与数组的两端等距。也就是说,在一个排序数组中,从中间下值到第一个元素的距离与从中间上值到最后一个元素的距离相同,而与位于同一元素中的下中间值和上中间值无关,或者不是。因此,我们只需要计算两者之一,从两端移动那么远,获取这些元素并计算它们的平均值。 (如果它们碰巧是相同的,计算两个相同值的平均值不会有害。)我们必须克服的唯一障碍是 jq 从一开始就从 0 开始计数,但在从数组的末尾开始,因此两个索引的绝对值必须是一个并且具有相反的符号。

      为了计算平均值,传统上会先将值相加,然后将总和减半。但是,在处理空数组时,将(不存在的)值相加会产生null,随后应用/2 会引发错误。但是,如果我们先将值减半并使用? 跳过不适用的地方,那么为最终的add 获取null 不会造成问题,因为它应该是输入空数组时的预期输出。

      sort | [ .[length/2 | ceil | -.,.-1] /2? ] | add
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-22
        • 1970-01-01
        • 2019-07-04
        • 1970-01-01
        • 2018-08-12
        • 1970-01-01
        相关资源
        最近更新 更多