Я надеюсь на помощь в решении новой задачи в моем ветеринарном исследовательском проекте. Мне нужен способ перекрестной проверки значений в разных столбцах моей электронной таблицы Excel. Я хочу убедиться, что для каждого случая (птицы), которому присвоена категория, имеется хотя бы один диагноз (подкатегория) для этой категории; и что птице, которой не была присвоена эта категория, не был поставлен ошибочный диагноз. У меня 6500 случаев (птиц), 27 категорий и более 200 диагнозов (подкатегорий), поэтому я надеюсь, что формула поможет мне сэкономить время и повысить точность.
Таким образом, в таблице выше в столбце ПЕРЕКРЕСТНАЯ ПРОВЕРКА (выходные данные) будут два ПРАВИЛЬНЫХ условия: «0» и «1».
В столбце ПЕРЕКРЕСТНАЯ ПРОВЕРКА (выходные данные) будут два состояния ОШИБКИ: «2» и «3».
Чтобы усложнить задачу, буквы «N» и «Y» в столбцах «КАТЕГОРИЯ» и «ДИАГНОСТИКА» были заполнены с использованием функций LAMBDA и BYROW.
Я попробовал несколько формул, некоторые из которых включают ЕСЛИ(СЧЁТЕСЛИ), но смог найти только два потенциальных условия (0/1 или Да/Нет) для столбца перекрестной проверки. Мне нужна более сложная формула, и мне трудно ее написать самому. Кроме того, я думаю, что из-за LAMBDA/BYROW мне придется выполнить жесткий возврат к каждой строке в столбце перекрестной проверки, чтобы получить правильный результат. У меня есть Microsoft 365.
=BYROW(B2:E6,LAMBDA(b,LET(c,SUM(N(DROP(b,,1) = "Y"))>0,IF(TAKE(b,,1) = "Y",IF(c,1,2),IF(c,3,0)))))
Оператор if используется для значения первого столбца (IF(TAKE(b,,1) = "Y"
), затем мы проверяем, что количество (/сумма) значений оставшегося столбца, равное «Y», больше 0 (SUM(N(DROP(b,,1) = "Y"))>0
объявлено как c
), чтобы получить дифференцированные результаты.
Или немного короче: =BYROW(B2:E6,LAMBDA(b,LET(c,OR(DROP(b,,1) = "Y"),IF(@T(b) = "Y",IF(c,1,2),IF(c,3,0)))))
Лорен,
Решение P.b должно сработать. Поскольку я все еще использую Excel 2010, у меня нет доступа к функциям Excel 365.
Я предлагаю следующий подход:
а) создайте новый столбец «Имеет диагноз» по формуле:
=IF(COUNTIF(C2:E2,"Y")=0,0,1)
б) Внесите в графу «ПЕРЕКРЕСТНАЯ ПРОВЕРКА»:
=IF(AND(G2=0,B2 = "N"),0,IF(AND(G2>0,B2 = "Y"),1,IF(AND(G2>0,B2 = "N"),3,2)))
Преимущества моего подхода (с моей точки зрения): 1) сохраняется обратная совместимость с предыдущими версиями Excel и 2) более читаемый код.
Я тестировал такие формулы:
Вау, это здорово, я проверю! Мне нравится идея обратной совместимости. Спасибо!
Другой способ, без использования вспомогательных функций LAMBDA()
и с использованием MMULT()
+ XMATCH()
:
• Формула, используемая в ячейке F2
=XMATCH(B2:B6&IF(MMULT(N(C2:E6 = "Y"),TOCOL(RIGHT(C1:E1))^0),"Y","N"),
{"NN";"YY";"YN";"NY"})-1
Используя MMULT()
, верните счетчики для Diagnosis
. Если больше 0, то Y
, иначе N
, присоединитесь к столбцу Category
, чтобы создать ссылку, и используйте XMATCH()
, чтобы найти относительные позиции элемента в массиве.
Если для Diagnosis
всегда есть три столбца, то может быть немного короче:
=XMATCH(B2:B6&IF(MMULT(N(C2:E6 = "Y"),{1;1;1}),"Y","N"),{"NN","YY","YN","NY"})-1
Эта формула преобразует входные данные в двоичное, а затем десятичное значение и с помощью CHOOSE
определяет выходное значение формулы.
В строке столбца CrossCheck 2: (и перетащите вниз)
=CHOOSE(BIN2DEC(VALUE(TEXTJOIN("",FALSE,IF(B2:E2 = "N",0,1))))+1,0,3,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1)
С небольшим дополнением для автоматического размещения будущих записей (COUNTA(A:A)
).
Надеюсь, ваши птицы не будут возражать против рядов кошек :)
Еще раз спасибо за вашу помощь, Нкалви, в еще одной задаче моего ветеринарного исследовательского проекта, и я совсем не против кошек!
Или за один раз:
=IF(B2 = "Y",IF(AND(C2:E2 = "N"),2,1),IF(AND(C2:E2 = "N"),0,3))