2016-04-29 2 views
1

Я работаю над данными из населения людей с аллергией. Каждый человек имеет уникальный ExceptionID, и каждый аллерген имеет уникальный AllergenID (всего 451).Sumproduct или Countif на 2D-матрице

У меня есть таблица данных с 2 столбцами (ExceptionID и AllergenID), где агонисты каждого человека перечислены подряд за строкой. Это означает, что столбец ExceptionID имеет повторяющиеся значения для людей с множественными аллергиями, а столбец AllergenID имеет повторяющиеся значения для разных людей, у которых есть эта аллергия.

Я пытаюсь подсчитать, сколько раз каждая пара аллергии присутствует в этой популяции (например, аллерген # 107 & Аллерген # 108, # 107 Аллерген & Аллерген # 109, и т.д.). Чтобы это было просто, я создал матрицу из 451 строк X 451 столбцов, представляющих каждую пару (два раза фактически потому, что A/B и B/A эквивалентны).

Мне как-то нужно использовать имя строки (allergenID) для поиска ExceptionID в моей таблице данных и подсчитать случаи, когда они совпадают с идентификаторами исключения из имени столбца (также AllergenID). У меня нет проблем с использованием Vlookup или Index/Match, но я борюсь с правильной комбинацией формулы поиска и Sumproduct или Countif.

Любая помощь очень ценится!

Mike PS Я использую Excel 2016, если это что-то меняет.

- = UPDATE = - Итак, методы, предложенные Dirk и MacroMarc, работали, хотя я не мог применить последнее к моему полному набору данных (17 000+ строк), потому что он занимал много времени.

С тех пор я решил превратить это в макрос VBA, потому что теперь мы хотим видеть количество триплетов вместо пар.

+0

Попытка уточнить - для каждого идентификатора исключения вы хотите идентифицировать пары идентификаторов аллергенов, которые происходят. Верный? – OldUgly

+0

Это полностью вопрос @scottcraner = P Кто еще должен мне сделать макрос для моей стирки. – findwindow

+0

Или другим способом - если ExceptionID встречается дважды, будет одна пара AlergenID; если ExceptionID встречается три раза, будет три пары AllergenID; если ExceptionID встречается четыре раза, будет шесть пар AllergenID; и так далее. – OldUgly

ответ

0

С 2 столбцами, на которых вы начинаете, это так же хорошо, как невозможно ... Вам нужно будет проверить каждый ExceptionID, чтобы иметь 2 разных конкретных аллергенных идентификатора. Лучше использовать вспомогательный стол с ExceptionID в виде строк и AllergenID в виде столбцов (или наоборот ... что угодно). Для вспомогательного стола нужна такая формула, как:

=COUNTIFS($A:$A,$D2,$B:$B,E$1) 

Какой из них можно автозаполнять. (Диапазоны из моего примера, вам нужно изменить их на свои нужды).

С помощью этого хелперов-матрицы вы можете легко пойти для большей матрицы, как это:

=COUNTIFS(E:E,1,INDEX($E:$G,,MATCH($I2,$E$1:$G$1,0)),1) 

Опять же, вы можете автоматически заполнить эту формулу, но вы должны изменить его, так что он соответствует вашим потребностям ,
Поскольку столбцы имеют одинаковый ID2 (будет вашим AllergenID), нет необходимости искать их, потому что E:E автоматически изменяется с автозаполнением.

Важнейшая часть формул - это $, которые не должны быть перепутаны, или вы не можете их автоматически заполнить.

Изображение моего самодельного примера (формулы из верхней левой ячейки в каждой таблице):
enter image description here

Если у вас есть какие-либо вопросы, просто спросите :)

+0

Это также хороший способ проверить наличие удвоений ... вспомогательный стол должен содержать только 0 'и 1';) –

+0

Dirk, это фантастика! Я думал об использовании вспомогательного стола, но не мог понять, как это будет отличаться от прямого перехода к окончательному результату. Большое спасибо за вашу помощь, и быстро! Я по глупости забыл копировать свои файлы на свой Google-диск, поэтому тестирование фактических данных придется ждать до понедельника, но тестовые данные, которые вы создали, очень хорошо имитируют реальную вещь. – MikeG

+0

Добро пожаловать :) –

0

Это может быть сделано прямо с оригинальной настройки с формулами массива:

Пожалуйста, обратите внимание, что формулы массива должны быть введены с Ctrl-Shift-Enter, перед копированием поперек и вниз:

enter image description here

В примере pic у меня есть NAMED диапазоны данных $ A $ 2: $ A $ 21 как «Люди» и $ B $ 2: $ B $ 21 как «Аллергены», чтобы сделать его более приятным. Вы можете видеть в строке формул, как это выглядит как формула. Однако вы можете использовать стандартные ссылки, как это в первой ячейке матрицы:

EDIT: глупо меня, функция N не требуется, чтобы превратить булевы в 1 и 0, так как умножение булевых будет делать трюк. Ниже формула работает ...

SUM(IF(MATCH($A$2:$A$21,$A$2:$A$21,0)=ROW($A$2:$A$21)-1, NOT(ISERROR(MATCH($A$2:$A$21&$E2,$A$2:$A$21&$B$2:$B$21,0)))*NOT(ISERROR(MATCH($A$2:$A$21&F$1, $A$2:$A$21&$B$2:$B$21,0))), 0))

Затем скопируйте из F2 поперек и вниз. Возможно, это улучшилось в технике с помощью sumproduct или что-то еще, но это всего лишь примерный пример метода.

+0

Спасибо Marc, я также дам ваш подход, когда я получу работу в понедельник. Любая идея, какой из двух методов, скорее всего, будет быстрее? Я думаю, что матрица 451x451 займет некоторое время ... – MikeG