Значения уровней формул Excel в наборе данных на основе значений страны находятся в

Мне нужно иметь возможность использовать таблицу, просматривать один столбец значений и распределять их по уровням следующим образом:

Верхние 20 % — это уровень 1, второй уровень — следующие 30 %, нижние 50 % уровня 3, данные о производительности уровня 4 отсутствуют.

Например, если для страны имеется 25 значений, то верхние 20% значений будут 5 верхними значениями (25*0,2).

Это необходимо сделать для каждой страны индивидуально, И значения и количество значений для каждой страны различаются (см. таблицу ниже).

Страна Ставка Аргентина 0,04 Аргентина 0,11 Аргентина 0,00 Аргентина 0,14 Аргентина 0,00 Аргентина 0,04 Аргентина 0,09 Аргентина 0,13 Аргентина 0,40 Аргентина 0,00 Аргентина Аргентина Австралия 0,66 Австралия 0,30 Австралия 0,37 Австралия 0,38 Австралия 0,37 Австралия 0,33 Австралия 0,32 Австралия 0,12 Австралия 0,19 Австралия 0,10 Австралия 0,11 Австралия 0,00 Австралия 0,00 Австралия 0,00 Австрия 1,47 Австрия 1.05 Австрия 0,50 Австрия 0,14 Бельгия 0,07 Бельгия 0,37 Бельгия 0,11 Бельгия 0,05 Бельгия Бельгия Бразилия 0,39 Бразилия 0,31 Бразилия 0,74 Бразилия 0,35 Бразилия 0,15 Бразилия 0,60 Бразилия 0,24 Бразилия 0,22 Бразилия 0,23 Бразилия 0,22 Бразилия 0,29 Бразилия 0,14 Бразилия 0,24 Бразилия 0,05 Бразилия 0,10 Бразилия Бразилия

НАПРИМЕР:

Я сделал это вручную для Канады:

Страна Ставка Уровень Канада 0,27 2 Канада 0,13 3 Канада 0,06 3 Канада 0,00 3 Канада 0,00 3 Канада 0,00 3 Канада 0,00 3 Канада 1.33 1 Канада 0,76 1 Канада 0,33 1 Канада 0,32 1 Канада 0,28 1 Канада 0,19 2 Канада 0,24 2 Канада 0,23 2 Канада 0,19 2 Канада 0,16 2 Канада 0,16 2 Канада 0,15 3 Канада 0,15 3 Канада 0,13 3 Канада 0,10 3 Канада 0,08 3 Канада 0,15 3 Канада 0,05 3

Любая помощь будет оценена по достоинству :)

Можете ли вы объяснить, как получить свои лучшие 20%? Для Канады =0.32-0.32*20% равно 0.256, но это не та логика. Вы имеете в виду ПРОЦЕНТЫ? Пожалуйста, объяснитесь.

P.b 01.08.2024 11:49

(вместо того, чтобы публиковать логику в комментарии, отредактируйте ее там, чтобы улучшить качество вашего вопроса)

P.b 01.08.2024 12:07

Я разместил неправильную таблицу выше, теперь она отредактирована, спасибо.

stayschemin 01.08.2024 12:31

но какая логика используется; почему 0.27 для Канады рассчитывается, например, в tier 2, а 0.28 в tier 1?

P.b 01.08.2024 12:41

поскольку уровень 1 — это 5 самых высоких ставок, 0,27 — шестое значение в списке, поэтому попадает в уровень 2.

stayschemin 02.08.2024 10:04

Да, у вас есть несколько ответов на выбор. Как видите, желательно изменить данные на таблицу (ctrl+t).

P.b 02.08.2024 11:22
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
6
78
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я считаю, что ваши вручную рассчитанные уровни неверны. Однако вот начальный метод, который вам нужно будет настроить, чтобы он работал в соответствии с вашей собственной логикой.

Сначала вставьте вспомогательный столбец, который получает «граничную» точку для верхних 20% — формула

=IFERROR(PERCENTILE.INC(IF($A$2:$A$80=A2, $B$2:$B$80), 0.2), "")

Сделайте то же самое для точки 50%.

=IFERROR(PERCENTILE.INC(IF($A$2:$A$80=A2, $B$2:$B$80), 0.5), "")

Столбец для расчета уровня становится

=IF(B2 = "", 4, IF(B2>=C2, 1, IF(B2>=D2, 2, 3)))

Я предположил, что страна указана в столбце A, а ставка — в столбце B. Следите за диапазоном строк — я использовал только от 2 до 80.

Спасибо за эти рекомендации, но я использовал решение от IKE, которое оказалось самым быстрым для того, что мне нужно :)

stayschemin 02.08.2024 17:23

Не уверен, правильно ли я понял логику:

=IF([@Rate] = "",4,XMATCH(PERCENTOF(XMATCH([@Rate],SORT(FILTER([Rate],[Country]=[@Country]))),ROWS(FILTER([Rate],[Country]=[@Country]))),{1;0.8;0.5},1))

При этом проверяется, находится ли значение в пределах 20% строк самых высоких значений, следующих 30% и т. д.

Не уверен, как вы ожидаете, что он будет вести себя в случае совпадения значений на уровнях.

Использование PERCENTRANK.INC (о существовании которого я не знал до прочтения ответов): =IF([@Rate] = "",4,XMATCH(PERCENTRANK.INC(FILTER([Rate],[Country]=[@Country]),[@Rate]),{1,0.8,0.5},1))

или: =IF([@Rate] = "",4,3-SUM(N(PERCENTRANK.INC(FILTER([Rate],[Country]=[@Country]),[@Rate])>{1,0.8,0.5})))

или используя диапазоны: =LET(d,A2:C26,a,TAKE(d,,1),b,INDEX(d,,2),MAP(a,b,LAMBDA(c,d,IF(d = "",4,XMATCH(PERCENTRANK.INC(FILTER(b,a=c),d),{1,0.8,0.5},1)))))

Ответ принят как подходящий

Другое решение с использованием таблицы:

=LET(countryData,FILTER([Rate],([Country]=[@Country])*([Rate]<>"")),
    rankedValue,IFNA(PERCENTRANK.INC(countryData,[@Rate]),0),
    XLOOKUP(rankedValue,{0.8;0.5;0},{1;2;3},"",-1))

Круто, никогда раньше не видел PERCENTRANK.INC. Действительно хороший вариант использования.

P.b 01.08.2024 15:19

ВАУ Это идеально! СПАСИБО очень ценно.

stayschemin 02.08.2024 17:23

На основе очень хорошего ответа Айка: использование REDUCE для получения результата за пределами таблицы; не уверен, улучшит ли это производительность.

=LET(
    percentages_for_tiers, {0.8, 0.5, 0},
    tiers, SEQUENCE(, COUNT(percentages_for_tiers)),
    has_value, LAMBDA(a, LEN(TRIM(a))),
    rate_tier, LAMBDA(country,
        LET(
            rates_for_country, FILTER(
                RatesByCounty[Rate],
                RatesByCounty[Country] = country
            ),
            non_empty_rates, FILTER(
                RatesByCounty[Rate],
                has_value(RatesByCounty[Rate]) *
                    (RatesByCounty[Country] = country)
            ),
            ranked_values, PERCENTRANK.INC(
                non_empty_rates,
                rates_for_country
            ),
            tier, XLOOKUP(
                ranked_values,
                percentages_for_tiers,
                tiers,
                ,
                -1
            ),
            comment_1, "Filter etc. return 0 for blank cells, so replace these zeros",
            non_empty_rate, FILTER(
                has_value(RatesByCounty[Rate]),
                RatesByCounty[Country] = country
            ),
            IF(non_empty_rate, tier, "")
        )
    ),
    result, REDUCE(
        "Tier",
        UNIQUE(RatesByCounty[Country]),
        LAMBDA(acc, cur, VSTACK(acc, rate_tier(cur)))
    ),
    result
)

Я не думаю, что сокращение/vstack целесообразно/требуется в этом случае. MAP или BYROW могут имитировать таблицу (см. последний вариант в моем ответе). Тем не менее, красиво оформлен.

P.b 02.08.2024 11:37

Спасибо, П.б, я займусь этим после утреннего кофе;)

nkalvi 02.08.2024 11:45

@P.b, поскольку процентильный рейтинг основан в первую очередь на округе, я получаю его (и, следовательно, уровень) только один раз для каждой страны, а не фильтрую и вычисляю для каждой строки. Я использую сокращение для обработки вложенных массивов стран. Учитывая мой ограниченный опыт работы с Excel, я не смог найти способ улучшить это — когда у вас будет время, не могли бы вы MAP это сделать? Еще раз спасибо.

nkalvi 02.08.2024 16:02

Возможно, вы правы. Я проверю это позже.

P.b 02.08.2024 18:00

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