web-dev-qa-db-ja.com

行のグループの移動平均を計算するArrayFormula

次のシートのAmountグループごとにName列の移動平均を計算する配列式を書くことはできますか?

行はNameでソートされます。列Cには、配列数式があります。

(=ArrayFormula(IF(LEN(B2:B),SUMIF(ROW(B2:B),"<="&ROW(B2:B),B2:B)/COUNTIF(ROW(B2:B),"<="&ROW(B2:B)),))) 

Amountグループに関係なくName列全体の移動平均を計算しますが、Nameが変更されるたびに移動平均を再開する式が必要です。私の式の結果(AdamLからの以前の回答に感謝します)は列Cにあり、望ましい結果は列Dに示されています。

NAME    AMOUNT   RUN AVE   DESIRED
Tom          3         3         3
Tom          7         5         5
Tom          8         6         6
Tom          2         5         5
Bill        10         6        10
Bill         0         5         5
1
DwightM

条件付き移動平均の場合、A2:Aのすべてのエントリがグループ化されていると仮定します。

=ArrayFormula(IFERROR((SUMIF(ROW(A2:A),"<="&ROW(A2:A),B2:B)-HLOOKUP(0,SUMIF(ROW(A2:A),"<"&ROW(A2:A),B2:B),MATCH(A2:A,A2:A,0),0))/(ROW(A2:A)-MATCH(A2:A,A2:A,0)-ROW(A2)+2)))


数か月前にスプレッドシートの最新バージョンに更新する前に、MMULTを次のような「条件付き実行合計」問題に使用することをお勧めしていました。

=ArrayFormula(IF(LEN(A2:A),MMULT((ROW(A2:A)>=TRANSPOSE(ROW(A2:A)))*(A2:A=TRANSPOSE(A2:A)),--B2:B)/MMULT((ROW(A2:A)>=TRANSPOSE(ROW(A2:A)))*(A2:A=TRANSPOSE(A2:A)),SIGN(ROW(A2:A))),))

このソリューションには、A2:A列をグループ化または並べ替える必要がないという利点もあります。ただし、最新バージョンでは、参照範囲が3163行に達すると、MMULTソリューションが破損します。これは、MMULTによって形成された2D配列が1,000万を超える要素を傾けるからです(1000万の平方根= 3162.278 ...)。

最初のソリューションはこの制限を受けませんが、数千行を参照する場合はおそらく非常に遅くなります。

2
AdamL