Как я могу получить среднюю формулу, которая пропускает ошибки - PullRequest
3 голосов
/ 24 сентября 2019

Я пытаюсь получить среднее значение по четырем точкам данных.
Проблема в том, что одна или несколько точек данных могут отсутствовать.

Среднее значение должно быть средним за последние четыре дня иличетыре последних вторника и т. д.
Каждая точка данных находится на расстоянии около 1000 строк, поэтому моя идея заключалась в том, чтобы «составить список» необходимых дат и использовать vlookup и среднее.

Общая формула

// I only add two dates, but the same formula is repeated for four dates
=AVERAGE(VLOOKUP(DATE_1;Table;25;FALSE);VLOOKUP(DATE_2;Table;25;FALSE))

DATE_1 и DATE_2 - это динамические вычисления двух предыдущих, скажем, понедельников.
Это работает, если есть все даты, но если один понедельник отсутствуетVLOOKUP возвращает ошибку, и ошибка не может быть рассчитана как среднее.
Я подумал, что могу обернуть VLOOKUP с помощью IFERROR, но я не могу заставить это работать либо

// for simplicity I removed the average and only show one. 
IFERROR(VLOOKUP(DATE_1;Table;25;FALSE);"") // returns empty string, can't calculate

IFERROR(VLOOKUP(DATE_1;Table;25;FALSE);0) // Works, but it skews the result with a zero.

Я знаю, AVERAGE пропускаетпустые ячейки, но как я могу «подражать» пустой ячейке."" - это пустая строка, и это не то же самое.
Существует ли формула, которая может обрабатывать ошибки и при этом давать мне среднее значение, или формула, которая возвращает «пустую ячейку»?

Ответы [ 4 ]

2 голосов
/ 24 сентября 2019

В этом вся суть функции AGGREGATE .

Вместо AVERAGE(SomeRange) используйте AGGREGATE(1, 6, SomeRange).Вместо AVERAGE(Value1, Value2) используйте AGGREGATE(1, 6, Value1, Value2)

. 1 сообщает AGGREGATE, чтобы вычислить AVERAGE, а 6 сообщает ему «Игнорировать значения ошибок».Полный список значений находится внизу этого поста

=AGGREGATE(1,6,VLOOKUP(DATE_1;Table;25;FALSE);VLOOKUP(DATE_2;Table;25;FALSE))

(Как уже отмечалось, это не совсем правильно работает без промежуточных ячеек вычисления - когда вы используете формулу в функции,Excel отказывается принять его в справочной форме)

справочная форма: AGGREGATE(function_num, options, ref1, [ref2], …)
форма массива: AGGREGATE(function_num, options, array, [k])

Function_num | Function 
      1      | AVERAGE
      2      | COUNT
      3      | COUNTA
      4      | MAX
      5      | MIN
      6      | PRODUCT
      7      | STDEV.S
      8      | STDEV.P
      9      | SUM
     10      | VAR.S
     11      | VAR.P
     12      | MEDIAN
     13      | MODE.SNGL
     14      | LARGE
     15      | SMALL
     16      | PERCENTILE.INC
     17      | QUARTILE.INC
     18      | PERCENTILE.EXC
     19      | QUARTILE.EXC

Option | Behaviour
   0   | Ignore nested SUBTOTAL and AGGREGATE functions
   1   | Ignore hidden rows, nested SUBTOTAL and AGGREGATE functions 
   2   | Ignore error values, nested SUBTOTAL and AGGREGATE functions
   3   | Ignore hidden rows, error values, nested SUBTOTAL and AGGREGATE functions
   4   | Ignore nothing
   5   | Ignore hidden rows
   6   | Ignore error values
   7   | Ignore hidden rows and error values
2 голосов
/ 24 сентября 2019

Просто предоставив вам другой подход, даже если он не совсем совпадает с вашим вопросом, я просто поделился, как решил аналогичную проблему.

В этом нет справочной таблицыЯ лично стараюсь избегать этого в этих ситуациях, так как вы всегда должны обновлять их при определенных условиях.

{=AVERAGE(IF((WEEKDAY(A1:A276,2)=1)*((L1:L276)>0)*((A1:A276)>((TODAY())-29)),L1:L276,""))}

формула массива, поэтому ctrl + shift + enter

(WEEKDAY(A1:A276,2)=1) тестыесли это понедельник

(L1:L276)>0) - это то место, где у меня есть значения, и поэтому я хочу игнорировать нули

((A1:A276)>((TODAY())-29)) добавил этот параметр, чтобы вы могли проверить, не старше ли он 4 недель

если эти условия выполняются, соответствующее значение в L: L берется как среднее (A: A - дата в этом примере)

2 голосов
/ 24 сентября 2019

Вот еще одно решение для вас (формула массива - Ctrl + Shift + Enter):

=AVERAGE(IF(ISNUMBER(MATCH($A$1:$A$10,CHOOSE({1,2,3,4},DATE_1,DATE_2,DATE_3,DATE_4),0)),$B$1:$B$10))

Результат:

enter image description here

1 голос
/ 24 сентября 2019

INDEX & MATCH не вызывает той же проблемы, попробуйте это:

=AVERAGE(INDEX(YourColumnRange;MATCH(DATE_1;Table));INDEX(YourColumnRange;MATCH(DATE_2;Table)))

РЕДАКТИРОВАТЬ: Чтобы соответствовать вашему набору данных, вы можете вручную вычислить среднее значение, как это:

=SUM(IFERROR(INDEX(Y:Y,MATCH(Date_1,A:A,0)),0), IFERROR(INDEX(Y:Y,MATCH(Date_2,A:A,0)),0))/
COUNT(INDEX(Y:Y,MATCH(Date_1,A:A,0)), INDEX(Y:Y,MATCH(Date_2,A:A,0)))

Это позволит вам пропускать пустые строки.Формула упрощена для общего случая, чтобы ее было легче читать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...