Объединение нескольких столбцов по порядку появления

Итак, у меня есть таблица Excel, которая выглядит следующим образом.

Ранг – База данных 1 – База данных 2 – База данных 3 – База данных 4

    • Запись A – Запись C – Запись G – Запись C
    • Запись Б – Запись А – Запись А – Запись D
    • Запись C – Запись F – Запись B – Запись E
    • Запись D – Запись B – Запись E – Запись A
    • Запись E – Запись D – Запись D – Запись G

Я хочу объединить все эти записи/столбцы в один столбец, в зависимости от того, как часто и насколько высоко появлялась запись, если это имеет смысл. Я думал о назначении очков в зависимости от позиции, чтобы первый игрок получал 1 очко, второй - 2 и так далее, а не появлялся в этом списке - 6 или более очков. Так, например, A появился первым в базе данных 1, вторым в базе данных 2, вторым в базе данных 3 и четвертым в базе данных 4, он получит 9 баллов, и если я сделаю это для всех записей, я в конечном итоге получу список, который ранжирует их по тому, как часто и насколько высоко они появляются. Выполнение этого вручную, очевидно, является вариантом, но A склонен к ошибкам, а B - утомителен, поэтому мне было интересно, есть ли какой-нибудь способ автоматизировать это.

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


56
3

Ответы:

Вы пробовали СЧЁТЕСЛИ в отдельном столбце для каждого варианта записи? Это даст вам общие частоты по всему массиву в новом массиве, который вы сможете скрыть позже; и в этом массиве на основе строки вы можете добавить в формулу значение «бонуса» (я просто применил номер ранга, так как в вашем примере ранг 1 стоил меньше очков), чтобы указать ранг, как вы предложили?

Тогда вы могли бы найти свои результаты в этом массиве для каждой записи и для каждого ранга?

Возможно, есть более простой способ, но это моя первая мысль.

ПримерТаблица1


Решено

Вот один из способов:

=LET(,_DB1,A1:A5,_DB2,B1:B5,_DB3,C1:C5,_DB4,D1:D5,
_DataSet,UNIQUE(VSTACK(_DB1,_DB2,_DB3,_DB4)),
_RefDB1,IFERROR(XMATCH(_DataSet,_DB1,,-1),6),
_RefDB2,IFERROR(XMATCH(_DataSet,_DB2,,-1),6),
_RefDB3,IFERROR(XMATCH(_DataSet,_DB3,,-1),6),
_RefDB4,IFERROR(XMATCH(_DataSet,_DB4,,-1),6),
_Stack,HSTACK(_RefDB1,_RefDB2,_RefDB3,_RefDB4),
_BRSum,BYROW(_Stack,LAMBDA(a,SUM(a))),
_Sort,SORTBY(_DataSet,_BRSum),
_Sort)

Как это выглядит (H8:H12):

Как это работает: LET — это набор функций или аргументов, поэтому он компактен (правда, только в Excel 365).

_DBx вызывается ли каждая из ваших баз данных в функцию;

_DataSet — это коллекция всех уникальных ценностей;

_RefDBx затем присваивает каждой записи оценку, при этом 6 — «не найдено»;

_Stack затем складывает эти ряды баллов;

_BRSum суммирует каждое значение, выдавая оценку;

_Sort сортирует исходный набор данных в порядке значений, взятых из _BRSum;


Будет ли это работать? (При условии Microsoft 365)

  • Получить все уникальные записи
  • Для каждой записи присвойте ранг по позиции в столбце (XMATCH).
  • Ранг — это сумма позиций во всех столбцах.
  • show_ranks шаг предназначен только для того, чтобы показать расчет. Пожалуйста, удалите его из VSTACK, когда он больше не понадобится.
=LET(
    data, A1:D5,
    u_entries, SORT(UNIQUE(TOCOL(data))),
    not_found_rank, ROWS(u_entries) + 1,
    col_index, SEQUENCE(, COLUMNS(data)),
    rank_by_pos_in_col, LAMBDA(entry,
        IFNA(
            MAP(col_index, LAMBDA(c, XMATCH(entry, INDEX(data, , c)))),
            not_found_rank
        )
    ),
    show_ranks, REDUCE(
        EXPAND({"Entry", "Rank", "Col Pos"}, , COLUMNS(data) + 2, ""),
        u_entries,
        LAMBDA(acc, cur,
            VSTACK(
                acc,
                HSTACK(
                    cur,
                    SUM(rank_by_pos_in_col(cur)),
                    rank_by_pos_in_col(cur)
                )
            )
        )
    ),
    entry_rank, TAKE(DROP(show_ranks, 1), , 2),
    sorted, SORT(entry_rank, 2),
    IFNA(VSTACK(show_ranks, "== Sorted = = ", sorted), "")
)