Подсчет парных комбинаций из множества опций в Excel

407
ermintrude75

У меня есть большой набор данных студентов и классов, которые они взяли. Каждый ученик прошел от 12 до 18 из примерно 80 доступных занятий. Используя Excel (2013), я хотел бы выяснить, сколько учеников взяли оба из них. Я представляю таблицу с 80 классами в виде строк и столбцов, а затем для каждого пересечения я вижу количество учеников, принявших эту комбинацию.

Данные поступают в виде файла Excel с одной строкой на каждого учащегося в классе:

Student Class Smith E101 Jones E101 Parker E101 Brown E102 Green E102 Smith E201 Jones E202 Parker E201 Brown E202 Green E203 ... 

Предполагаемый результат:

 E101 E102 E201 E202 E203 ... E101 0 2 1 0 E102 0 0 1 1  E201 2 0 0 0 E202 1 1 0 0 E203 0 1 0 0 ... 

(Очевидно, мне нужна только диагональ половины вышеприведенного, поскольку другая половина отражает его.)

Я использовал сводную таблицу, чтобы получить данные в таблицу со студентами в виде строк, а все возможные классы - в виде столбцов, в которых 1 показывает, где студент проходил данный класс.

 E101 E102 E201 E202 E203 ... Smith 1 1  Jones 1 1  Parker 1 1  Brown 1 1  Green 1 1 ... 

Но затем я застрял на том, как, с минимальным ручным вмешательством, достичь желаемого результата.

Кто-нибудь может предложить способ достижения результата, который мне нужен в Excel? Я провел довольно обширный поиск, но ничего не нашел.

Или я должен искать другое программное обеспечение?

3
Добро пожаловать в Супер пользователя! Обратите внимание, что https://superuser.com не является бесплатным сервисом для написания скриптов / кодов. Если вы сообщите нам, что вы уже пробовали (включая скрипты / код, который вы уже используете) и где вы застряли, мы можем попытаться помочь с конкретными проблемами. Вам также следует прочитать [Как мне задать хороший вопрос?] (Https://superuser.com/help/how-to-ask). DavidPostill 5 лет назад 0
Я не использую никаких скриптов / кода. Я дошел до того, что использовал сводную таблицу, как указано выше, чтобы перейти от простого списка к перекрестной таблице ученика и класса. Теперь я не знаю, есть ли способ достичь того, чего я хочу (согласно посту) в Excel, несмотря на довольно обширный поиск. Поэтому мой вопрос заключается в том, могу ли я получить эту информацию в Excel, и если да, то как? Я не хочу быть тупым, но я не вижу, что не так с моим вопросом, и хотел бы получить больше объяснений по этому поводу. Я не прошу код, но предложения подходов. ermintrude75 5 лет назад 2

1 ответ на вопрос

2
robinCTS

Это довольно просто сделать в Excel с помощью формулы, которая работает с вашей сводной таблицей.

С двумя таблицами, настроенными так

Worksheet Screenshot showing Tables and Formula

введите следующую формулу J2и ctrl-enter / copy-paste / fill-down & right / auto-fill в остальные ячейки таблицы:

= IF( J$1=$I2, "", COUNTIFS( INDEX($A$1:$F$6,ROW($A$1:$F$6),MATCH(J$1,$A$1:$F$1,0)):INDEX($A$1:$F$6,1+ROWS($A$1:$F$6)-ROW($A$1:$F$6),MATCH(J$1,$A$1:$F$1,0)), 1, INDEX($A$1:$F$6,ROW($A$1:$F$6),MATCH($I2,$A$1:$F$1,0)):INDEX($A$1:$F$6,1+ROWS($A$1:$F$6)-ROW($A$1:$F$6),MATCH($I2,$A$1:$F$1,0)), 1 ) ) 


Объяснение:

Первым аргументом COUNTIFS()функции является динамически генерируемый столбец сводной таблицы, соответствующий заголовку столбца выходной таблицы. Немного легче понять, если мы посмотрим на промежуточные оцениваемые шаги (для ячейки L2):

INDEX($A$1:$F$6,ROW($A$1:$F$6),MATCH(L$1,$A$1:$F$1,0)):INDEX($A$1:$F$6,1+ROWS($A$1:$F$6)-ROW($A$1:$F$6),MATCH(L$1,$A$1:$F$1,0))
INDEX($A$1:$F$6,1,MATCH("E201",$A$1:$F$1,0)):INDEX($A$1:$F$6,6,MATCH("E201",$A$1:$F$1,0))
INDEX($A$1:$F$6,1,4):INDEX($A$1:$F$6,6,4)
$D$1:$D$6

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

Аналогично для третьего аргумента COUNTIFS()функции, но на этот раз динамически генерируемый столбец сводной таблицы соответствует заголовку строки выходной таблицы. Для клетки L2это оценивается как $B$1:$B$6.

Таким образом, COUNTIFS()функция L2становится

COUNTIFS($D$1:$D$6,1,$B$1:$B$6,1) 

который является стандартным способом подсчета количества строк (студентов), где оба столбца содержат 1(т.е. студент был зачислен в оба класса).

Инкапсулирующая IF()функция предназначена для того, чтобы гарантировать, что диагональные ячейки не заполнены.

Спасибо @robinCTS! Пожалуйста, примите огромные извинения за время, необходимое для ответа. У меня были некоторые проблемы со входом в StackExchange, что означало, что я не мог ответить до сих пор, но я прочитал и реализовал решение. Я просто настроил диапазоны для моих собственных данных, и это работает отлично. Я особенно ценю подробное объяснение каждого элемента - это заняло некоторое время, но я понимаю. Я очень благодарен за ваше время! ermintrude75 5 лет назад 1
@ ermintrude75 Не проблема. Рад помочь! Мне просто жаль, что ваш вопрос был изначально закрыт и занял много времени, чтобы его снова открыли. robinCTS 5 лет назад 0

Похожие вопросы