R: объединение узлов, которые имеют одинаковые взаимодействия из сетевой таблицы
У меня есть большая сетевая таблица, которую я хочу упростить, объединив узлы, которые совместно используют одни и те же взаимодействия, чтобы у нее была лучшая сеть после создания образа (я использую Cytoscape). Взаимодействия не имеют направления. В качестве мини-примера, если у меня есть таблица, такая как ниже.
A E
B E
C G
C H
D G
H D
E F
R S
Два столбца являются узлами, которые взаимодействуют друг с другом. В этом случае, поскольку все узлы A, B и F имеют соединения только с узлом E, я хочу объединить их, так что это A,B,F как один узел, который взаимодействует с E. Аналогично, поскольку и C, и D взаимодействуют только с G и HI хотел бы объединить их вместе. Получившаяся таблица должна выглядеть примерно так:
A,B,F E
C,D G
C,D H
R S
Я создал список со всеми узлами, но я не уверен, как посмотреть, имеют ли они совпадающие взаимодействия, поскольку они могут быть в любом столбце. Есть ли хороший способ / программа для этого?
2 ответа
Для большинства сетей не было бы единственного решения этой проблемы. Как только вы начинаете рушиться, вы начинаете исключать другие не менее действительные решения. Например, даже в вашем упрощенном примере это другие допустимые решения:
A, B, FE G, HC G, HD RS
или даже
A,B,F E C,D G,H R S
И это становится более сложным, когда вы включаете взаимодействия в свой относительно чистый пример, например, в A G. Но если ваши данные действительно разделены, как в этом примере (что должно быть сразу видно, когда вы загружаете их в iGraph или Cytoscape и выполняете любую базовую компоновку для посмотрите на кучу отдельных сетей), тогда вы сможете получить решение, запросив всех партнеров по взаимодействию для каждого узла, а затем свернувшись на основе идентичных наборов партнеров.
Я не знаю функции iGraph или Cytoscape, которая может сделать это для вас.
И если ваша сеть не является секционированным набором из нескольких сетей, то я не думаю, что это вообще возможно.
Правильно ли я понимаю, что ваш график cytoscape содержит все упомянутые элементы, а "взаимодействия" обозначают ребра в cytoscape? Потому что, если ваша сеть имеет указанные элементы и ребра, вы можете, например, (это не будет быстрым решением, я думаю), создать массив со всеми идентификаторами ваших элементов с
cy.nodes();
а затем позвоните
Object.keys(cy.edges("[target = '" + nodeId + "']")).length;
на каждом узле в массиве и сохранить количество ребер, выходящих из указанного узла в массиве. Таким образом, вы можете найти все узлы с как минимум x присоединенными узлами, а затем вы можете делать все, что захотите. Например, вы можете сделать выбранные узлы родителями, чтобы подключенные узлы теперь находились внутри родительских узлов?
Пожалуйста, скажите мне, если это поможет вам или нет:)