滚动 AVERAGEIF 公式的数组公式?

Scr*_*eap 1 google-sheets google-sheets-formula

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

=AVERAGEIF(INDIRECT("A2:A"&ROW()), ">=0",INDIRECT("A2:A"&ROW()))    
Run Code Online (Sandbox Code Playgroud)

因此,如果您将此公式放在 B 列中,它将采用 A 列中的值并不断对它们进行向下平均,跳过任何小于 0 的值。以下是示例屏幕截图:https://i.stack.imgur.com /Aj0ar.png

我怎样才能为此制作一个数组公式?


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

=ArrayFormula(IF(LEN(A2:A),SUMIF(ROW(A2:A),"<="&ROW(A2:A),A2:A)/COUNTIF(ROW(A2:A),"<="&ROW(A2:A)),))
Run Code Online (Sandbox Code Playgroud)

cal*_*hiz 5

拉姆达更新

不再需要ArrayFormula为此使用。

=MAP(SEQUENCE(COUNTA(A2:A)),
  LAMBDA(rowOff,
    AVERAGEIF(OFFSET(A2,0,0,rowOff),">=0"))
)
Run Code Online (Sandbox Code Playgroud)

如何?

  • rowOff对于1.. 中的每个元素# items in column:
    • 用于AverageIf获取从顶部行开始的所有内容的平均值rowOff,排除所有内容>=0

旧的解决方案

这是一个可以进入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"),"")))
Run Code Online (Sandbox Code Playgroud)

可读:

=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"
        ),
        ""
    )
))
Run Code Online (Sandbox Code Playgroud)

如何?

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