Как я могу сослаться на два разных столбца в функции COUNTIF?


11

Я постараюсь объяснить. Скажем, у меня есть лист, который выглядит следующим образом (в этом надуманном примере, скажем, я рассылаю маркетинговые электронные письма разным людям, знаю их возраст и почтовые индексы и хочу отслеживать рейтинг кликов в этих письмах):

        A   |    B        |    C  
  1     Age |    zip code |  click?  
  2     26  |    11111    |  true  
  3     27  |    11112    |  true  
  4     28  |    11111    |  false  
  5     27  |    22222    |  false  
  6     28  |    11112    |  false  
  7     26  |    22222    |  true  

Теперь я хочу отслеживать различные характеристики. В этом случае я хочу отслеживать рейтинг кликов по возрасту и по почтовому индексу. Итак, у меня есть такая таблица:

      E         F          G 
 1   Age  |  # sent  | # clicked
 2   26   |
 3   26   |
 4   27   |
 5   28   |

Так что в основном в столбце «# sent» я могу поставить (например, в F2):

=COUNTIF(A:A, E2)

И это привело бы к 2 в ячейке F2, потому что было два вхождения «26» в столбце A.

Но что теперь, если я хочу узнать, сколько кликнуло? Я хочу сказать что-то вроде:

=COUNTIF(A:A == E2  AND  C:C == True, for the same row where A:A matched E2)

Я знаю, что могу добавить еще один столбец D с формулой, как

=IF(C2, A2, "")

Это будет только возраст в столбце D, если столбец C истинен. Но у меня может быть много критериев, и мне не нужно добавлять еще один «поддельный» столбец для каждого столбца критериев, который у меня есть.

Есть ли способ сделать это? Если не в Google Docs, в Excel?


Примечание: ответ для новых Google Sheets находится там .

Ответы:


11

Используйте комбинацию ARRAYFORMULA, SUM и арифметических операций.

Вот функция подсчета всех кликов по возрасту 26 лет:

=ARRAYFORMULA(sum((A:A=26) * (C:C="true")))

Эта операция состоит из 3 частей.

  • ARRAYFORMULA заботится о зацикливание в указанном диапазоне
  • SUM управляет подсчет всех истинных результатов

По сути, true преобразуется в 1, а false преобразуется в 0. Булева логика выполняется с использованием арифметических операций.

И операция использует умножение:

  • (1 * 1) = 1 - (True && True) = True
  • (1 * 0) = 0 - (True && False) = False
  • (0 * 0) = 0 - (Ложь && Ложь) = Ложь

ИЛИ операция использует комбинацию * SIGN функции и дополнение:

  • знак (1 + 1) = 1 - (True || True) = True
  • знак (1 + 0) = 1 - (True || False) = True
  • знак (0 + 0) = 0 - (Ложь || Ложь) = Ложь

Примечание. Функция sign необходима из-за того, что логическое сложение работает иначе, чем арифметическое сложение. В основном при логическом сложении 1 + 1 = 1, в арифметическом сложении 1 + 1 = 2. Очевидно, что арифметическое сложение испортит счет, поэтому вам нужно пропустить результаты операций сложения через функцию знака. Функция знака возвращает 1, если значение положительное, 0, если значение 0, и -1, если значение отрицательное.

Допустим, вы хотели посчитать клики для всех пользователей в возрасте 20-25 лет:

=ARRAYFORMULA(sum(sign((A:A=20) + (A:A=21) + (A:A=22) + (A:A=23) + (A:A=24) + (A:A=25)) * (C:C="true")))

ЗНАК не требуется здесь, не так ли? например, ни одна ячейка не может быть both20 и 23, так что сложение никогда не даст вам значение> 1 в этом случае. ЗНАК требуется только в том случае, если условия не являются взаимоисключающими. Также не было бы легче сделать между 20 и 25 с этой версией? =arrayformula(sum((A:A>=20)*(A:A<=25)*(C:C=TRUE)))
Барри Гудини

Я пытался объяснить общее использование логики ИЛИ. Если бы тесты не были исключительными (содержались в том же столбце), тогда была бы необходима функция SIGN. В этом случае это не так. И да, ваш пример будет лучшим подходом, но не демонстрирует использование OR. Я пытался придумать упрощенный подход, чтобы продемонстрировать использование ИЛИ, которое подходит к вопросу ОП, но я, очевидно, не очень хорош в том, чтобы придумывать примеры из-под контроля. Если у вас есть примеры получше, я советую вам отредактировать / улучшить ответ.
Эван Плейс

Извинения, Эван, я неправильно понял - это отличный пример.
Барри Гудини

вы можете избежать = true, поэтому: = ARRAYFORMULA (сумма ((A: A = 26) * C: C))
тик

1
@tic Я не использовал булево значение true (что соответствует значению TRUE в таблицах Google). Я имел в виду «true» - строку, которую опер использовал в своем вопросе. Попробуйте, я уверен, что если вы протестируете значения для C: C, он всегда вернет TRUE в непустой строке. В ячейках электронной таблицы Google придерживается правил Excel по JavaScript. Добро пожаловать в увлекательный мир неплотных абстракций.
Эван Плейс

10

На данный момент новые Google Sheets поддерживают COUNTIFS, которые могут напрямую обрабатывать требуемую работу.

=COUNTIFS(A:A, E2, C:C, "true")

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


4
Спасибо, что награждаешь меня прокруткой вниз. Это ответ при работе с новыми гугл листами.
Кристиан Вестербик

3

В Excel я бы использовал SUMPRODUCT в Excel 2003 или COUNTIFS (с "S") в Excel 2007 или более поздней версии ....... но в Google Docs попробуйте это

=arrayformula(sum((A:A=E2)*(C:C=TRUE)))


3
=COUNTA( IFERROR( FILTER('Guest List'!$G:$G ; 'Guest List'!$G:$G = "Yes" ; 'Guest List'!$L:$L = "USA" ) ) )

Это было для двух столбцов - в этом случае я использую это для моего списка приглашенных на свадьбу - в таблице указано «Да» при отправке даты сохранения и «США» для местоположения, чтобы я мог вычислить почтовые расходы позже. Может быть, более короткая формула, но это, кажется, работает, так что я не возиться с этим!

Удачного подсчета.


1

В Excel я бы забыл формулы и использовал сводные таблицы.

Вам может потребоваться добавить один столбец «counter», который можно использовать снова и снова в качестве переменной, которую вы суммируете, чтобы получить результаты.


0

Вы можете добавить массив, который вы хотите проверить в {}.

В приведенном ниже примере:

=countif({F2,H2,J2,L2,N2,P2,R2,T2,V2,W2},"TRUE")
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.