Promedio de las últimas 7 celdas no vacías no vacías en Hojas de cálculo de Google

11

Tengo números en el rango D7: D y hay momentos en que algunas celdas están vacías. Quiero el promedio de los últimos 7 números, pero omitir espacios en blanco. Entonces, si en los últimos 7 solo hay 3 que están llenos, quiero que retroceda más y encuentre 7 en total y los promedie.

Bob Esponja Pantalones Cuadrados
fuente

Respuestas:

6

Aquí hay un enfoque:

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

Explicación:

  • filter(row(D7:D), len(D7:D)) devuelve una matriz que consta de los números de fila de las entradas no vacías en el rango dado.
  • large(..., 7) selecciona el séptimo número más grande de esta matriz: este es el número de fila donde desea comenzar a promediar.
  • iferror(..., row(D7))es una protección en caso de que su rango tenga menos de 7 entradas no en blanco: en este caso, el promedio comenzará con D7. Podría haber puesto "7" en lugar de row(D7), pero row(D7)hace que la fórmula sea más portátil en caso de que decida copiarla en otro lugar.
  • indirect("D" & ... & ":D")forma el rango para promediar, por ejemplo, D9:Dsi el resultado del cálculo anterior fue 9.
  • Finalmente, averagehace el promedio. También podría poner otras funciones agregadas aquí.

fuente
funciona y se actualiza a nuevos cambios!
Spongebob Squarepants
Gracias, pero ahora creo que la respuesta de JPV debería ser la aceptada: es más simple y semánticamente natural.
no se actualizó correctamente para mí, pensé que también era más fácil, pero una vez que agregué más números no funcionó.
Spongebob Squarepants
6

TL; DR

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

Ejemplo

ingrese la descripción de la imagen aquí

Explicación

  • Primero contamos cuántos números hay en la fila A con =COUNT(A:A). Las celdas que contienen texto no se contarán. Nuestro ejemplo nos daría9
  • A partir de este número le restamos 7 ya que desea que el promedio de los últimos 7 valores: =COUNT(A:A)-7. Esto nos dará un 2.
  • Ahora usamos la función de desplazamiento para obtener un rango de una columna completa pero con un desplazamiento de 2 celdas, lo que significa que solo nos queda una parte de una columna con exactamente 7 valores restantes

    Imagine una columna sin celdas en blanco antes de la primera celda con valores. Entonces podría verse un ejemplo simplificado =OFFSET(A:A; COUNT(A:A)-7 ;0). Pero esto no funcionará tan pronto como la columna comience con celdas en blanco como se muestra en la imagen de arriba

  • Ahora necesitamos extender nuestro desplazamiento por el número de celdas en blanco. Eso no significa que contamos todos los valores en blanco en una fila. Solo los que están antes de la primera celda no vacía.

    Puede contar con ellos =MATCH(TRUE;INDEX(A:A<>0);0)-1y obtener 6como resultado o nuestro ejemplo

    Ahora modificamos nuestra función de desplazamiento y agregamos este conteo para obtener el rango correcto que contiene solo 7 valores
    OFFSET(A:A; COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1 ;0)

    ingrese la descripción de la imagen aquí

  • Como último paso calculamos el promedio de este rango. Nuestro ejemplo nos daría 4 como resultado ya que el promedio de 1,2,3,4,5,6,7 es 4.
    =AVERAGE(OFFSET(A:A;COUNT(A:A)-7 + MATCH(TRUE;INDEX(A:A<>0);0)-1;0))

nixda
fuente
Excelente respuesta.
ale
funcionó bien, pero una vez que agregué otra celda, ¿no se actualizó correctamente?
Spongebob Squarepants
2

Otra forma más:

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

Explantación

  1. filtrar todos los valores numéricos
  2. voltee la columna al revés (para que los últimos valores estén arriba) usando sort ()
  3. limitar la salida de esa columna a 7 filas (usando ARRAY_CONSTRAIN)
  4. Toma el promedio ...

EDITAR: Perdón por malentendidos. Lo anterior promedia los 7 valores MÁS GRANDES, no los últimos 7 valores en una columna. Para promediar los últimos 7 valores, la solución de Normal Human es excelente. Una forma alternativa con menos funciones sería usar QUERY ()

Suponiendo los datos numéricos en la columna A, intente:

=AVERAGE(QUERY(ARRAYFORMULA({ROW(A:A),A:A}),"select Col2 where Col2 is not null order by Col1 desc limit 7", 0))
JPV
fuente
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

usuario0
fuente