【问题标题】:Array formula for a rolling AVERAGEIF formula?滚动 AVERAGEIF 公式的数组公式?
【发布时间】:2020-09-14 17:25:33
【问题描述】:

我有一个工作公式,我需要拖动它来自动填充一列并希望将其变成一个数组公式:

=AVERAGEIF(INDIRECT("A2:A"&ROW()), ">=0",INDIRECT("A2:A"&ROW()))    

因此,如果您将这个公式放在 B 列中,它将采用 A 列中的值并不断平均下来,跳过任何小于 0 的值。这是一个示例截图:https://i.imgur.com/nRq8hAH.png

我怎样才能为此创建一个数组公式?


这个公式很接近,但我不知道如何添加 ">=0" 条件:

=ArrayFormula(IF(LEN(A2:A),SUMIF(ROW(A2:A),"<="&ROW(A2:A),A2:A)/COUNTIF(ROW(A2:A),"<="&ROW(A2:A)),))

【问题讨论】:

  • 我可以演示一种方法,如果您让电子表格可编辑而不是仅查看。

标签: google-sheets google-sheets-formula


【解决方案1】:

这里有一个公式可以进入B2(不用拖),但是比较复杂:

=ArrayFormula(IFERROR(IF(LEN(A2:A),MMULT(TRANSPOSE((SEQUENCE(COUNTA(A2:A),1,2)<=TRANSPOSE(SEQUENCE(COUNTA(A2:A),1,2)))*FILTER(A2:A,LEN(A2:A))),--(FILTER(A2:A,LEN(A2:A))>0))/COUNTIFS(SEQUENCE(COUNTA(A2:A)),"<="&SEQUENCE(COUNTA(A2:A)),FILTER(A2:A,LEN(A2:A)),">=0"),"")))

可读:

=ArrayFormula(IFERROR(
    IF(
        LEN(A2:A),
        MMULT(
            TRANSPOSE(
                (SEQUENCE(COUNTA(A2:A),1,2)<=
                    TRANSPOSE(SEQUENCE(COUNTA(A2:A),1,2))
                )*FILTER(A2:A,LEN(A2:A))
            ),
            --(FILTER(A2:A,LEN(A2:A))>0)
        )/
        COUNTIFS(
            SEQUENCE(COUNTA(A2:A)),
            "<="&SEQUENCE(COUNTA(A2:A)),
            FILTER(A2:A,LEN(A2:A)),
            ">=0"
        ),
        ""
    )
))

怎么做?

  1. 我们可以使用MMULT 在大小为COUNTA(A2:A) 的所有1 和A2:A 的所有非空白的下三角矩阵上实现运行总和,如果数字为负,我们将其过滤掉。在这种情况下,它会生成 {2;2;6;6;6;6}
  2. COUNTIFS() 生成一个包含我们想要除以的元素数量的数组。这里是{1;1;2;2;3;4}
  3. 然后忽略 IF 处的任何空格。
  4. 使用IFERROR 清除所有错误。 (如果前导数字为负数,则可能发生#DIV/0! 错误。)

【讨论】:

    【解决方案2】:

    或许,这个公式会有所帮助:

    =ARRAYFORMULA(AVERAGE(IF($A$2:A2>=0,$A$2:A2,"")))
    

    【讨论】:

    • 适用于下拉公式,但 OP 可能要求单个 ArrayFormula。
    猜你喜欢
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    相关资源
    最近更新 更多