Excel извлекает значения из нескольких тестов

В конечном итоге я пытаюсь найти среднее значение трех верхних значений для каждого теста в последний день для «Человека 1». Я могу найти последний день, используя формулу Large(If()), и могу подключить ее к функции Unique(Filter()), чтобы найти соответствующие «тестовые» числа за день. Моя проблема возникает, когда я пытаюсь извлечь фактические результаты теста. Мои данные:

Person            Date         Test    Rep    Result
Person 1    10/9/2023   1   5   1.06459372
Person 1    10/9/2023   1   4   1.11329722
Person 1    10/9/2023   1   3   0.91809
Person 1    10/9/2023   1   2   0.92332983
Person 1    10/9/2023   1   1   0.81854742
Person 1    10/9/2023   2   5   0.79415372
Person 1    10/9/2023   2   4   0.78722627
Person 1    10/9/2023   2   3   0.77623751
Person 1    10/9/2023   2   2   0.75960889
Person 1    10/9/2023   2   1   0.55552335
Person 1    10/9/2023   3   5   1.25761919
Person 1    10/9/2023   3   4   1.38660111
Person 1    10/9/2023   3   3   1.28825923
Person 1    10/9/2023   3   2   1.11500258
Person 1    10/9/2023   3   1   0.93898195
Person 1    10/9/2023   4   5   1.01453846
Person 1    10/9/2023   4   4   1.06929
Person 1    10/9/2023   4   3   0.93578771
Person 1    10/9/2023   4   2   0.94945872
Person 1    10/9/2023   4   1   0.84496289
Person 1    10/23/2023  1   5   1.58905785
Person 1    10/23/2023  1   4   1.49243315
Person 1    10/23/2023  1   3   1.4587432
Person 1    10/23/2023  1   2   1.58905785
Person 1    10/23/2023  1   1   1.47988413
Person 1    10/23/2023  2   5   0.368215
Person 1    10/23/2023  2   4   1.66144122
Person 1    10/23/2023  2   3   1.3734
Person 1    10/23/2023  2   2   1.75722655
Person 1    10/23/2023  2   1   1.24049032
Person 2    4/29/2024   1   5   1.89406839
Person 2    4/29/2024   1   4   1.90691308
Person 2    4/29/2024   1   3   1.81291382
Person 2    4/29/2024   1   2   1.58922
Person 2    4/29/2024   1   1   1.40970617
Person 2    4/29/2024   2   5   1.70049909
Person 2    4/29/2024   2   4   1.92244355
Person 2    4/29/2024   2   3   1.92599629
Person 2    4/29/2024   2   2   1.63100333
Person 2    4/29/2024   2   1   1.67577882

Я использую формулу =FILTER(E:E,UNIQUE(FILTER(E:E,IF((A:A=H3)*(B:B=LARGE(IF(A:A=H3,B:B),1)),C:C)))), где столбец E — это результаты теста, а H3 — раскрывающийся список имен. Эта формула дает мне результат «#VALUE». Я также попробовал включить логику, где =...,K:K=Unique(Filter())...

Для контекста я также буду искать интеграцию Макса, чтобы найти максимальное среднее значение за день, если это имеет какое-либо влияние на формулу. Но моя отправная точка — попытаться найти 3 лучших повторения в тесте в последний день (23.10.23 для человека 1).

У ваших IF отсутствует значение, если оно ложное.

cybernetic.nomad 06.08.2024 21:59

Возможно, отфильтровать по человеку, затем отсортировать по дате (по убыванию) и результату (по убыванию) и взять три верхних значения, но слишком много данных для ввода и проверки.

Tom Sharpe 06.08.2024 23:17

Не могли бы вы подтвердить, что в вашей установке доступна поддержка динамических массивов и FILTER? Они доступны в Excel 2021 по следующему адресу: support.microsoft.com/en-us/office/…

nkalvi 07.08.2024 17:12
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
3
87
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

=LET(f,FILTER(C2:E41,(A2:A41 = "Person 1")*(B2:B41=MAXIFS(B2:B41,A2:A41,"Person 1"))),MAP(UNIQUE(TAKE(f,,1)),LAMBDA(m,AVERAGE(LARGE(FILTER(TAKE(f,,-1),TAKE(f,,1)=m),{1;2;3})))))

Сначала создается фильтр для максимальной даты для человека 1 (f). Далее уникальные тесты обозначаются как m. Затем усредняются 3 наибольших значения за тест.

Насколько я знаю, это будет работать в Excel 2021:

=LET(x,"Person 1",f,FILTER(Table1[[Date]:[Result]],(Table1[[Person]:[Person]]=x)*(Table1[[Date]:[Date]]=MAXIFS(Table1[[Date]:[Date]],Table1[[Person]:[Person]],x))),u,UNIQUE(INDEX(f,,2)),t,SORT(FILTER(INDEX(f,SEQUENCE(ROWS(f)),{2,4}),INDEX(f,,2)=INDEX(u,ROW(A1),)),2,-1),IFERROR(INDEX(CHOOSE({1,2},INDEX(t,1,1),AVERAGE(INDEX(t,{1,2,3},2))),,COLUMN(A1)),""))

Оно не способно пролиться. но вы можете перетащить его вниз и вправо, чтобы отобразить следующее среднее значение теста, равное 3.

При перетаскивании он показывает имя/идентификатор теста в первом столбце, в который вы его вставляете, и среднее значение трех верхних значений этого теста в столбце справа от него.

Спасибо, я уверен, что это сработает. К сожалению, в моей офисной подписке нет функций LAMBDA или MAP. Я работаю с Office профессиональный плюс 2021. Быстрый поиск показывает, что эта функция не была перенесена в мою версию.

Cra538 07.08.2024 16:38

Я проверю сегодня позже. Но, может быть, вы можете использовать его онлайн: Excel.new?

P.b 07.08.2024 16:45

@Cra538 Cra538 проверьте редактирование. Я работал со ссылками на таблицы, дайте мне знать, что вам подходит.

P.b 07.08.2024 19:54
Ответ принят как подходящий

С СРЕДНИМИ, с разливом

Вот вариант со вспомогательным столбцом и AVERAGEIFS; Вспомогательный столбец упрощает формулу.

  • Добавьте вспомогательный столбец для ранжирования результатов.
  • Поскольку это динамическая формула, ее не нужно заполнять.

Столбец ранга:

=LET(
    data, $A$2:$E$5000,
    persons, INDEX(data, , 1),
    dates, INDEX(data, , 2),
    tests, INDEX(data, , 3),
    results, INDEX(data, , 5),
    COUNTIFS(
        persons, persons,
        dates, dates,
        tests, tests,
        results, ">" & results
    ) + 1
)

Столбец результатов:

=LET(
    for_persons, H3:H4,
    top_n, 3,
    data, $A$2:$F$5000,
    persons, INDEX(data, , 1),
    dates, INDEX(data, , 2),
    tests, INDEX(data, , 3),
    results, INDEX(data, , 5),
    ranks, INDEX(data, , 6),
    latest_dates, MAXIFS(dates, persons, for_persons),
    AVERAGEIFS(
        results,
        persons, for_persons,
        dates, latest_dates,
        ranks, "< = " & top_n
    )
)

Обновлено для Excel 2021 без LAMBDA.

При наличии FILTER

=LET(
    person, H3,
    latest_date, MAXIFS(
        Table2[Date],
        Table2[Person], person
    ),
    rank_for_result, COUNTIFS(
        Table2[Person], person,
        Table2[Date], Table2[Date],
        Table2[Test], Table2[Test],
        Table2[Result], ">" & Table2[Result]
    ) + 1,
    latest_results, FILTER(
        Table2[Result],
        (rank_for_result <= 3) *
            (Table2[Date] = latest_date)
    ),
    AVERAGE(latest_results)
)

Результат:

Скриншот формулы:

Исправлено 7 августа 2024 г.

Внес исправление, любезно указанное П.б.


Не такой компактный, как у P.b, но с использованием таблицы. Пожалуйста, дайте мне знать, если преобразование в таблицу невозможно.

=REDUCE(
    {"Person", "Lastest Date", "Avg for Top 3"},
    UNIQUE(Table1[Person]),
    LAMBDA(acc, person,
        LET(
            latest_date, MAXIFS(Table1[Date], Table1[Person], person),
            test_and_results_for_latest_date, FILTER(
                HSTACK(Table1[Test], Table1[Result]),
                (Table1[Date] = latest_date) * (Table1[Person] = person)
            ),
            tests, INDEX(test_and_results_for_latest_date, , 1),
            results, INDEX(test_and_results_for_latest_date, , 2),
            top_3_per_test, DROP(
                REDUCE(
                    "top_3_per_test",
                    UNIQUE(tests),
                    LAMBDA(acc, test,
                        VSTACK(acc, TAKE(SORT(FILTER(results, tests = test), , -1), 3))
                    )
                ),
                1
            ),
            avg_for_top_3s, AVERAGE(top_3_per_test),
            VSTACK(acc, HSTACK(person, latest_date, avg_for_top_3s))
        )
    )
)

Топ-3 значения для каждого теста для максимальной даты для человека (1)

P.b 07.08.2024 08:06

Ах, да, спасибо, П.б! В ближайшее время исправим. Еще одна пара глаз определенно поможет!

nkalvi 07.08.2024 11:50

@P.b, не мог бы ты заглянуть сюда, когда будет время? Еще раз спасибо!

nkalvi 07.08.2024 13:13

=REDUCE({"Person","LastestDate","AvgforTop3"},UNIQUE(Table1[‌​Person]),LAMBDA(acc,‌​person,LET(latest_da‌​te,MAXIFS(Table1[Dat‌​e], Таблица1[Человек],pe‌​rson),test_and_resul‌​ts_for_latest_date,F‌​ILTER(HSTACK(Таблица1[‌​Тест],Таблица1[Результат]‌​),(Таблица1[Дата]=late‌​st_date)*(Таблица1[Пер‌ ​son]=person)),tests,‌​TAKE(test_and_result‌​s_for_latest_date,,1‌​),results,TAKE(test_‌​and_results_for_late‌​st_date,,-1),top_3_p‌​er_test,DROP(REDUCE(‌​"top_3_per_test ",UNI‌​QUE(тесты),LAMBDA(ac‌​c,test,VSTACK(acc,AV‌​ERAGE(TAKE(SORT(FILT‌​ER(+results,tests=te‌​st),,-1),3) )))),1),a‌​vg_for_top_3s,(top_3‌​_per_test),

P.b 07.08.2024 14:01

IFNA(VSTACK(acc,HSTACK(person,latest_date,avg_for_top_3s)),"‌​"))))

P.b 07.08.2024 14:01

Я не смог уместить это в 1 комментарий, поэтому вам нужно вставить оба комментария друг за другом. Я не сильно изменил ваш код. Основное изменение, которое необходимо исправить: СРЗНАЧ перенесен с одного слоя на предыдущий (вокруг TAKE(SORT(FILTER(),,-1),3).

P.b 07.08.2024 15:55

=REDUCE({"Человек","LastestDate","Test#","AvgforTop3"},UNIQUE‌​(Table1[Person]),LAM‌​BDA(acc,p,LET(latest‌​_date,MAXIFS(Table1[‌) ​Дата],Table1[Person]‌​,p),res_latest,FILTE‌​R(HSTACK(Table1[Test‌​],Table1[Результат]),(T‌​able1[Date]=latest_d‌​ate)*(Table1[ Person]‌​=p)),tests,TAKE(res_‌​latest,,1),results,I‌​NDEX(res_latest,,2),‌​top_3,DROP(REDUCE("t‌​op_3_per_test",UNIQU‌​E (тесты),LAMBDA(acc,‌​test,LET(top3_test_r‌​es,TAKE(SORT(FILTER(‌​HSTACK(tests,results‌​),tests=test),2,-1),‌​3), VSTACK(acc,HSTACK‌​(INDEX(top3_test_res‌​,1,1),AVERAGE(INDEX(‌​top3_test_res,,2))))‌​))),1),VSTACK(acc,IF‌​NA(HSTACK( p,latest_d‌​ate,top_3),HSTACK(p,‌​latest_date))))))

P.b 07.08.2024 15:55

Я использовал более короткие имена, чтобы можно было вставлять. Эта версия включает тестовую колонку

P.b 07.08.2024 15:56

Я потенциально мог бы превратить это в таблицу, если это поможет, однако в моей офисной подписке нет функций LAMBDA или MAP. Я работаю с Office профессиональный плюс 2021. Быстрый поиск показывает, что эта функция не была перенесена в мою версию.

Cra538 07.08.2024 16:39

Спасибо большое П.Б.! Я внесу эти изменения. @Cra538 Cra538, пока вы проверите решение Pb, я попробую собрать настольную и нетабличную версии позже сегодня.

nkalvi 07.08.2024 17:05

@P.b, пожалуйста, просмотри еще раз, когда у тебя будет время - спасибо!

nkalvi 07.08.2024 17:49

Да, в моей версии есть ФИЛЬТР. @nkalvi, версия с наличием ФИЛЬТРА заработала. Спасибо!

Cra538 07.08.2024 19:58

@nkalvi Обновление по-прежнему показывает среднее значение топ3 на человека, но не на тест на человека. Взгляните на результаты предложенных мной комментариев к версии 5 выше этой. Он включает в себя идентификатор теста (который, я думаю, может быть неупомянутым требованием, потому что в противном случае вы знаете 2 средних значения, но понятия не имеете, к чему они относятся.

P.b 07.08.2024 19:59

Вы правы, я не исправил «первую» версию, но включил сравнение идентификаторов тестов в последние. Первую обновлю позже. Я не могу оценить вашу помощь достаточно!

nkalvi 07.08.2024 20:33

Другие вопросы по теме