Итак, у меня есть таблица Excel, которая выглядит следующим образом.
Ранг – База данных 1 – База данных 2 – База данных 3 – База данных 4
Я хочу объединить все эти записи/столбцы в один столбец, в зависимости от того, как часто и насколько высоко появлялась запись, если это имеет смысл. Я думал о назначении очков в зависимости от позиции, чтобы первый игрок получал 1 очко, второй - 2 и так далее, а не появлялся в этом списке - 6 или более очков. Так, например, A появился первым в базе данных 1, вторым в базе данных 2, вторым в базе данных 3 и четвертым в базе данных 4, он получит 9 баллов, и если я сделаю это для всех записей, я в конечном итоге получу список, который ранжирует их по тому, как часто и насколько высоко они появляются. Выполнение этого вручную, очевидно, является вариантом, но A склонен к ошибкам, а B - утомителен, поэтому мне было интересно, есть ли какой-нибудь способ автоматизировать это.
Честно говоря, я попробовал это только вручную и теперь точно знаю, как мне вообще это делать.
Вы пробовали СЧЁТЕСЛИ в отдельном столбце для каждого варианта записи? Это даст вам общие частоты по всему массиву в новом массиве, который вы сможете скрыть позже; и в этом массиве на основе строки вы можете добавить в формулу значение «бонуса» (я просто применил номер ранга, так как в вашем примере ранг 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), "")
)