Média das últimas 7 células não vazias e não vazias no Planilhas Google

11

Eu tenho números no intervalo D7: D e há momentos em que algumas células estão vazias. Quero a média dos últimos 7 números, mas pular espaços em branco. Portanto, se nos últimos 7 houver apenas 3 completos, quero que volte mais longe e encontre 7 no total e calcule a média.

Bob Esponja Calça Quadrada
fonte

Respostas:

6

Aqui está uma abordagem:

=average(indirect("D" & iferror(large(filter(row(D7:D), len(D7:D)), 7), row(D7)) & ":D"))

Explicação:

  • filter(row(D7:D), len(D7:D)) retorna uma matriz que consiste nos números de linha das entradas não vazias no intervalo especificado.
  • large(..., 7) escolhe o sétimo maior número dessa matriz: este é o número da linha em que você deseja iniciar a média.
  • iferror(..., row(D7))é uma salvaguarda caso seu intervalo tenha menos de 7 entradas que não estejam em branco: nesse caso, a média começará com D7. Eu poderia simplesmente colocar "7" em vez de row(D7), mas row(D7)torna a fórmula mais portátil, caso você decida copiá-la em outro lugar.
  • indirect("D" & ... & ":D")forma o intervalo para a média, por exemplo, D9:Dse a saída do cálculo anterior for 9.
  • Finalmente, averagefaz a média. Você também pode colocar outras funções agregadas aqui.

fonte
obras e atualizações para novas alterações!
Bob Esponja Calça Quadrada
Obrigado, mas agora acho que a resposta do JPV deve ser a aceita: é mais simples e semanticamente natural.
não foi atualizado corretamente para mim, achei mais fácil também, mas depois que adicionei mais números, não funcionou.
Bob Esponja Calça Quadrada
6

TL; DR

=AVERAGE(OFFSET(A:A;COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1;0))

Exemplo

insira a descrição da imagem aqui

Explicação

  • Primeiro, contamos quantos números estão na linha A com =COUNT(A:A). Células que contêm texto não serão contadas. Nosso exemplo nos daria9
  • Deste número subtraímos 7 desde que você quer a média dos últimos 7 valores: =COUNT(A:A)-7. Isso nos dará a 2.
  • Agora usamos a função deslocamento para obter um intervalo de uma coluna completa, mas com um deslocamento de 2 células, o que efetivamente significa que resta apenas uma parte de uma coluna com exatamente 7 valores restantes

    Imagine uma coluna sem células em branco antes da primeira célula com valores. Então, um exemplo simplificado pode parecer =OFFSET(A:A; COUNT(A:A)-7 ;0). Mas isso não funcionará assim que a coluna começar com células em branco, como mostrado na figura acima

  • Agora precisamos estender nosso deslocamento pelo número de células em branco. Isso não significa que contamos todos os valores em branco em uma linha. Apenas os anteriores à primeira célula não vazia.

    Você pode contá-los =MATCH(TRUE;INDEX(A:A<>0);0)-1e obter 6como resultado ou nosso exemplo

    Agora modificamos nossa função de deslocamento e adicionamos essa contagem para obter o intervalo correto contendo apenas 7 valores
    OFFSET(A:A; COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1 ;0)

    insira a descrição da imagem aqui

  • Como último passo, calculamos a média desse intervalo. Nosso exemplo nos daria 4 como resultado, uma vez que a média de 1,2,3,4,5,6,7 é 4.
    =AVERAGE(OFFSET(A:A;COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1;0))

nixda
fonte
Excelente resposta.
ale
funcionou bem, mas depois que adicionei outra célula, ela não foi atualizada corretamente?
Bob Esponja Calça Quadrada
2

Ainda outra maneira:

=AVERAGE(ARRAY_CONSTRAIN(SORT(FILTER(A:A, ISNUMBER(A:A)), 1, 1), 7, 1))

Explicação:

  1. filtrar todos os valores numéricos
  2. vire a coluna de cabeça para baixo (para que os últimos valores estejam acima) usando sort ()
  3. limite a saída dessa coluna a 7 linhas (usando ARRAY_CONSTRAIN)
  4. Pegue a média ...

EDIT: Desculpe por mal-entendidos. A média acima calcula a média dos MAIORES 7 valores, não dos últimos 7 valores em uma coluna. Para calcular a média dos últimos 7 valores, a solução da Normal Human é ótima. Uma maneira alternativa com menos funções seria usar QUERY ()

Assumindo os dados numéricos na coluna A, tente:

=AVERAGE(QUERY(ARRAYFORMULA({ROW(A:A),A:A}),"select Col2 where Col2 is not null order by Col1 desc limit 7", 0))
JPV
fonte
0

=AVERAGE(IFERROR(QUERY(D7:D, 
 "where D is not null 
  offset "&COUNTA(QUERY(D7:D, "where D is not null", 0)) - 7, 0)))

0 0

user0
fonte