【问题标题】:Arrayformula to calculate average of last N-elementsArrayformula 计算最后 N 个元素的平均值
【发布时间】:2021-05-25 07:29:12
【问题描述】:

我想计算一列中前 N 个元素的平均值并返回一个数组。 B 列的最后 3 个元素的输出应该是这样的,C 列显示相应的公式。

在我真正的问题中,我需要为整个列使用arrayformula 返回结果。 D 列显示了计算非空行平均值的公式,但考虑到最后三个的子集,我无法返回结果。

以下问题:average the previous 5 cells that have values 解决了类似问题,但结果未作为数组返回。如果我调整D 列中的公式,使用问题的解决方案,我不会得到预期的结果:

=ARRAYFORMULA(if(NOT(ISBLANK(A:A)),
     Average(Filter(Sort(A:A,If(A:A="",0,Row(A:A)),false),
         Row(A:A)<3)),))

我没有得到预期的结果,所有非空行的结果都是5.5

【问题讨论】:

标签: google-sheets google-sheets-formula


【解决方案1】:

您的帖子示例显示从第 1 行开始的可计算数据(与第 1 行中的任何标题相反)。所以我写的公式将引用整个 A:A 列。

从B列中删除所有内容并将以下公式放入B1:

=ArrayFormula(IF(A:A="",,(SUMIF(ROW(A:A),"&gt;="&amp;ROW(A:A)-2,A:A)-SUMIF(ROW(A:A),"&gt;"&amp;ROW(A:A),A:A)) / IF(ROW(A:A)&lt;3,ROW(A:A),3)))

如果 A:A 中的单元格为空,则公式将为 B:B 中的相应单元格返回 null。

否则,第一个 SUMIF 将对 A:A 中的所有值求和,这些值位于从前两行开始的单元格中。从中减去第二个SUMIF A:A 中单元格编号大于当前单元格编号的所有值。这将为您留下每个单元格在内存中保存的“最后三行”的总数。然后将这个总数除以 IF 子句的返回值(即,如果当前行号小于 3,则为行号,否则为 3)。

同样,这是基于您的帖子的详细信息。如果您的实际应用程序没有从第 1 行开始并运行完整的 A:A 列,请使用此版本:

=ArrayFormula(IF(A2:A="",,(SUMIF(ROW(A2:A),"&gt;="&amp;ROW(A2:A)-2,A2:A)-SUMIF(ROW(A2:A),"&gt;"&amp;ROW(A2:A),A2:A)) / IF(SEQUENCE(ROWS(A2:A),1)&lt;3,SEQUENCE(ROWS(A2:A),1),3)))

只需将每个范围的第一个单元格引用(即此处为 A2)与可计算范围的实际第一个单元格交换即可。

【讨论】:

  • 如果在这两种情况下都有效。我测试了它是否也可以使用NOT(ISBLANK(A:A)) 使其与我工作表中的其他公式保持一致:=ArrayFormula(IF(NOT(ISBLANK(A2:A)),(SUMIF(IF(ROW(A2:A),ROW(A2:A)),"&gt;="&amp;ROW(A2:A)-2,A2:A)-SUMIF(IF(ROW(A2:A),ROW(A2:A)),"&gt;"&amp;ROW(A2:A),A2:A)) / IF(SEQUENCE(ROWS(A2:A),1)&lt;3,SEQUENCE(ROWS(A2:A),1),3),))。等待其他回复,如果不是正确的回复。
  • 我正在审查您的公式,我想知道为什么您需要这个:IF(ROW(A2:A),ROW(A2:A)) 它没有错误子句,因此它将始终返回 A2:A)。谢谢
  • 它不需要 IF 子句。它一定是构建公式的某个中间步骤的一部分,我忘记在最后删除它。我已经编辑了帖子中的公式,并删除了这些公式。很好的收获。
猜你喜欢
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
相关资源
最近更新 更多