Est-il possible d'écrire une formule matricielle qui calcule la moyenne mobile de la colonne Amount
pour chacun des groupes Name
de la feuille suivante?
Les lignes sont triées par Name
. Dans la colonne C, j'ai une formule de tableau:
(=ArrayFormula(IF(LEN(B2:B),SUMIF(ROW(B2:B),"<="&ROW(B2:B),B2:B)/COUNTIF(ROW(B2:B),"<="&ROW(B2:B)),)))
qui calcule une moyenne courante de toute la colonne Amount
quel que soit le groupe Name
, mais j'aimerais une formule qui relancerait la moyenne courante chaque fois que la Name
changerait. Les résultats de ma formule (merci beaucoup aux réponses précédentes de AdamL) sont dans la colonne C et le résultat souhaité est indiqué dans la colonne 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
Pour une moyenne courante conditionnelle, en supposant que toutes les entrées de A2: A sont regroupées:
=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)))
Avant la mise à jour de la dernière version de Sheets il y a un certain nombre de mois, il aurait été généralement conseillé d'utiliser MMULT pour résoudre ce type de problèmes de "total d'exécution conditionnel":
=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))),))
Cette solution présente également l’avantage supplémentaire que la colonne A2: Une colonne ne doit pas être groupée, ni triée. Cependant, dans la version la plus récente, la solution MMULT sera interrompue lorsque la plage référencée aura atteint 3163 lignes. Cela semble être dû au fait que le tableau 2D formé par MMULT inclinera plus de 10 millions d'éléments (racine carrée de 10 millions = 3162.278 ...).
La première solution ne devrait pas souffrir de cette limitation, mais elle sera probablement encore très lente lors du référencement de quelques milliers de lignes.