Есть ли способ использовать то же поле, что и строки и столбцы в листах Google, для подсчета уникальных вхождений между столбцами?

Глядя на конвертировать

Идентификатор задачи Джон Ян Джульетта 1 1 1 0 2 1 0 1 3 0 1 1 4 0 0 1 5 0 1 1 6 1 1 0 7 0 1 0 8 1 0 0 9 0 1 1 10 1 1 0

К

Джон Ян Джульетта Джон 3 1 Ян 3 3 Джульетта 1 3

Не могли бы вы объяснить, насколько 2-я таблица связана с 1-й таблицей?

Nikko J. 14.12.2020 17:20

Я понимаю, что вы пытаетесь здесь сделать, @user2884821. Однако у меня есть ощущение, что ваши образцы данных недостаточно точно отражают ваши реальные данные. Например, действительно ли у вас когда-либо будет ровно три человека (ни больше, ни меньше) для сравнения; или будут еще? Вы действительно будете отмечать задачи с 1 в своем реальном приложении; или вы будете вводить что-то еще (например, текст) в эти ячейки? Чтобы любой из присутствующих здесь мог эффективно и точно помочь вам, ваши данные должны быть максимально приближены к данным вашего реального приложения.

Erik Tyler 14.12.2020 17:36

Кроме того, в вашем реальном приложении всегда и только 10 задач? Или это число будет меняться?

Erik Tyler 14.12.2020 17:44

Привет, @ErikTyler, в реальном мире будет более 10 заданий и более 3 человек. Я просто хотел упростить сценарий здесь.

ayushsubedi 15.12.2020 06:11

@НиккоДж. Вторая таблица инкапсулирует уникальное количество задач, выполняемых двумя людьми (см. смежность).

ayushsubedi 15.12.2020 06:13

@ user2884821, я могу это решить. Тем не менее, я попрошу вас настроить образец электронной таблицы, содержащей информацию в вашем сообщении, и поделиться своей ссылкой здесь, обязательно установив для разрешения «Общий доступ» значение «Все, у кого есть ссылка, могут редактировать». Я знаю, что некоторые люди здесь не одобряют, когда просят людей сделать это, но для меня это самый эффективный способ поделиться своим решением.

Erik Tyler 15.12.2020 06:20

@ErikTyler, пожалуйста, найдите ссылку здесь: docs.google.com/spreadsheets/d/…

ayushsubedi 15.12.2020 07:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
441
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я создал новый лист («Помощь Эрика») в вашем образце электронной таблицы.

В В1:

=SORT(FILTER(Sheet1!B1:1,Sheet1!B1:1<>""))

Это просто заполняет верхнюю строку списком ваших имен, отсортированных по алфавиту.

В А2:

=TRANSPOSE(SORT(FILTER(Sheet1!B1:1,Sheet1!B1:1<>"")))

Это заполняет A2 тем же списком имен, что и выше, только вертикально.

В B2 основная формула для сетки (которая затем перетаскивается вверх и вниз):

=ArrayFormula(IF( ($A2 = "") + (B$1 = "") + ($A2=B$1),, SUM(MMULT(IF((FILTER(Sheet1!$B$2:$L,Sheet1!$A$2:$A<>"")=1) * (Sheet1!$B$1:$L$1=$A2),1,0), SEQUENCE(COLUMNS(Sheet1!$B$1:$L$1),1,1,0)) * MMULT(IF((FILTER(Sheet1!$B$2:$L,Sheet1!$A$2:$A<>"")=1) * (Sheet1!$B$1:$L$1=B$1),1,0), SEQUENCE(COLUMNS(Sheet1!$B$1:$L$1),1,1,0)))))

Первый ( ) + ( ) + ( ) проверяет три условия ИЛИ. Если что-то верно, ячейка останется пустой. Это то, что позволяет перетаскивать формулу полностью вправо и вниз, не выбрасывая ошибок и, по сути, «ожидая» новых данных из первых двух формул выше, которые она может обработать.

Остальная часть формулы слишком сложна, чтобы требовать полного объяснения (например, как работает MMULT в деталях), поскольку это сайт, управляемый добровольцами. (Написание формулы заняло больше времени, чем я обычно провожу за день на этом или других форумах.) Но вот суть.

Две сетки, каждая из которых сформирована с помощью MMULT (умножение матриц), SUMmed. Первый MMULT создаст сетку того же размера, что и сетка Sheet1, заполненную 1, только если выполняются два условия: что в этом слоте уже была 1 и что имя выше соответствует имени справа в «Справке Эрика». " сетка. В противном случае результат для этого слота равен нулю. Второй MMULT формирует сетку того же размера на основе тех же условий, только на этот раз он получает 1 только в том случае, если 1 уже есть, а имя выше совпадает с именем над ячейкой в ​​«Справке Эрика». Эти две сетки перемножаются, и если произведение равно 1, мы знаем, что в ОБОИХ именах есть 1. После SUMmed мы получаем количество общих проектов для этих двух имен.

При перетаскивании этой формулы ссылки на ячейки, не заблокированные знаком доллара, изменятся, так что два разных имени будут сравниваться двумя сетками MMULT.

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

Опять же, формула в настоящее время перетаскивается до столбца Z и вниз до строки 200. Однако она ссылается только на столбец L (что соответствует вашему текущему списку имен). Если ваше реальное приложение имеет больше имен и, таким образом, переносится за пределы столбца L, самый простой способ изменить все формулы сразу:

  1. Перейдите на лист «Erik Help» (который вы, конечно, можете переименовать по своему усмотрению).

  2. Нажмите Ctrl-H, чтобы открыть диалоговое окно «Найти/Заменить».

  3. Введите $L в поле НАЙТИ и $? в поле ЗАМЕНА (где ? будет новым столбцом, на который вы хотите распространить результаты, например, $M или $P и т. д.)

  4. Выберите «Этот лист» в раскрывающемся списке «Поиск».

  5. Установите флажок «Также искать в формулах».

  6. Нажмите кнопку «Заменить все».

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

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

=countifs(index($B$2:$D,0,row(A1)),1,index($B$2:$D,0,column(A1)),1)

потянул вниз и поперек.

Попытка более общего решения.

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

1 1 0 => 1 2

1 0 1 => 1 3

1 1 1 => 1 2, 1 3 and 2 3.

Этого можно достичь, сгенерировав пары чисел следующим образом и выполнив поиск в исходных данных:

1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3

Формулы для генерации этих последовательностей:

=ArrayFormula(quotient(mod(sequence(90,1,0),9),3)+1)

и

=ArrayFormula(mod(sequence(90,1,0),3)+1)

(9, потому что в строке данных 3X3 пары, 90, потому что в строке 10 данных).

Следующее генерирует поиск для каждой строки данных

=ArrayFormula(quotient(sequence(90,1,0),9)+1)

Объединив все это вместе и обернув в сводной запрос, вы получите

=ArrayFormula(query({vlookup(quotient(sequence(90,1,0),9)+2,{row(B2:D),B2:D},quotient(mod(sequence(90,1,0),9),3)+2,0)*(quotient(mod(sequence(90,1,0),9),3)+1),
vlookup(quotient(sequence(90,1,0),9)+2,{row(B2:D),B2:D},mod(sequence(90,1,0),3)+2,0)*(mod(sequence(90,1,0),3)+1)},
"select count(Col1) where Col1<>0 and Col2<>0 group by Col1 pivot Col2"))

Формулу можно обобщить на разное количество строк и столбцов.

Другие вопросы по теме