Формула Excel: извлечение уникальных элементов из списка -

Содержание

Общая формула

(=INDEX(list,MATCH(0,COUNTIF(uniques,list),0)))

Резюме

Чтобы извлечь только уникальные значения из списка или столбца, можно использовать формулу массива на основе ИНДЕКС, ПОИСКПОЗ и СЧЁТЕСЛИ. В показанном примере формула в D5, скопированная ниже, имеет следующий вид:

(=INDEX(list,MATCH(0,COUNTIF($D$4:D4,list),0)))

где «список» - именованный диапазон B5: B11.

Примечание: это формула массива, и ее нужно вводить с помощью Ctrl + Shift + Enter.

Объяснение

Ядро этой формулы - это базовый поиск с помощью INDEX:

=INDEX(list,row)

Другими словами, дайте INDEX список и номер строки, и INDEX получит значение для добавления в уникальный список.

Тяжелая работа заключается в том, чтобы вычислить номер СТРОКИ, чтобы получить ИНДЕКС, чтобы мы получали только уникальные значения. Это делается с помощью ПОИСКПОЗ и СЧЁТЕСЛИ, и главный трюк здесь:

COUNTIF($D$4:D4,list)

Здесь COUNTIF подсчитывает, сколько раз элементы, уже находящиеся в уникальном списке, появляются в главном списке, используя расширяющуюся ссылку для диапазона, $ D $ 4: D4.

Расширяющаяся ссылка с одной стороны абсолютна, а с другой - относительна. В этом случае по мере копирования формулы ссылка будет расширяться, чтобы включить больше строк в уникальный список.

Обратите внимание, что ссылка начинается с D4, на одну строку выше первой уникальной записи в уникальном списке. Это сделано намеренно - мы хотим подсчитать элементы * уже * в уникальном списке, и мы не можем включить текущую ячейку без создания круговой ссылки. Итак, начнем с строки выше.

Важно: убедитесь, что заголовок уникального списка не отображается в главном списке.

Для критериев в COUNTIF мы используем сам главный список. Если задано несколько критериев, СЧЁТЕСЛИ вернет несколько результатов в массиве. В каждой новой строке у нас есть другой массив, например:

(0;0;0;0;0;0;0) // row 5 (1;0;0;0;1;0;0) // row 6 (1;1;0;0;1;0;1) // row 7 (1;1;1;1;1;0;1) // row 8

Примечание. СЧЁТЕСЛИ обрабатывает несколько критериев с отношением «ИЛИ» (т. Е. СЧЁТЕСЛИ (диапазон, («красный», «синий», «зеленый»)) подсчитывает красный, синий или зеленый цвет.

Теперь у нас есть массивы, которые нам нужны для поиска позиций (номеров строк). Для этого мы используем ПОИСКПОЗ, настроенное на точное совпадение, чтобы найти нулевые значения. Если мы поместим массивы, созданные с помощью COUNTIF выше, в MATCH, мы получим следующее:

MATCH(0,(0;0;0;0;0;0;0),0) // 1 (Joe) MATCH(0,(1;0;0;0;1;0;0),0) // 2 (Bob) MATCH(0,(1;1;0;0;1;0;1),0) // 3 (Sue) MATCH(0,(1;1;1;1;1;0;1),0) // 6 (Aya)

ПОИСКПОЗ обнаруживает элементы, ища счетчик, равный нулю (то есть ищет элементы, которые еще не появляются в уникальном списке). Это работает, потому что ПОИСКПОЗ всегда возвращает первое совпадение при наличии дубликатов.

Наконец, позиции вводятся в ИНДЕКС как номера строк, и ИНДЕКС возвращает имя в этой позиции.

Версия без массива с LOOKUP

Вы можете создать формулу без массива для извлечения уникальных элементов, используя гибкую функцию ПРОСМОТР:

=LOOKUP(2,1/(COUNTIF($D$4:D4,list)=0),list)

Конструкция формулы аналогична приведенной выше формуле ИНДЕКС ПОИСКПОЗ, но ПРОСМОТР может обрабатывать операцию с массивом изначально.

  • СЧЁТЕСЛИ возвращает количество каждого значения из «списка» в расширяющемся диапазоне $ D $ 4: D4
  • Сравнение с нулем создает массив значений ИСТИНА и ЛОЖЬ.
  • Число 1 делится на массив, образуя массив из единиц и ошибок # DIV / 0.
  • Этот массив становится lookup_vector внутри LOOKUP
  • Значение поиска 2 больше, чем любые значения в lookup_vector
  • ПРОСМОТР будет соответствовать последнему значению без ошибок в массиве поиска
  • ПРОСМОТР возвращает соответствующее значение в result_vector, именованном диапазоне "list"

Извлеките элементы, которые появляются только один раз

Приведенную выше формулу ПРОСМОТР легко расширить с помощью булевой логики. Чтобы извлечь список уникальных элементов, которые появляются в исходных данных только один раз, вы можете использовать следующую формулу:

=LOOKUP(2,1/((COUNTIF($D$4:D4,list)=0)*(COUNTIF(list,list)=1)),list)

Единственное дополнение - это второе выражение COUNTIF:

COUNTIF(list,list)=1

Здесь СЧЁТЕСЛИ возвращает массив количества элементов, подобный этому:

(2;2;2;2;2;1;2)

которые сравниваются с 1, в результате получается массив значений ИСТИНА / ЛОЖЬ:

(FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE)

которые действуют как «фильтр», чтобы ограничить вывод элементами, которые встречаются в исходных данных только один раз.

Хорошие ссылки

Как извлечь уникальную особенность (Оскар Кронквист, Get Digital Help)

Интересные статьи...