Пару этих вопросов можно узнать, внимательно изучив документацию по функциям, которые вы используете. Например, документация clusters
в разделе «Значения» описывает, что будет возвращено функцией, пару из которых ответят на ваши вопросы. Помимо документации, вы всегда можете использовать функцию str
для анализа состава любого конкретного объекта.
Тем не менее, чтобы узнать членов или количество участников в определенном сообществе, вы можете посмотреть на объект membership
, возвращаемый функцией clusters
(которую вы уже используете для назначения цвета). Так что-то вроде:
summary(clusters(all2)$membership)
будет описывать идентификаторы кластеров, которые используются. В случае с вашими примерами данных похоже, что у вас есть кластеры с идентификаторами в диапазоне от 0 до 585, всего 586 кластеров. (Обратите внимание, что вы не сможете отобразить их очень точно, используя схему раскраски, которую вы используете в настоящее время.)
Чтобы определить количество вершин в каждом кластере, вы можете посмотреть на компонент csize
, также возвращаемый clusters
. В данном случае это вектор длиной 586, в котором хранится один размер для каждого вычисленного кластера. Так что вы можете использовать
clusters(all2)$csize
чтобы получить список размеров ваших кластеров. Имейте в виду, что ваши кластерные идентификаторы, как упоминалось ранее, начинаются с 0 («с нулевым индексом»), тогда как векторы R начинаются с 1 («с одним индексом»), поэтому вам нужно сместить эти индексы на один. Например, clusters(all2)$csize[5]
возвращает размер кластера с идентификатором 4.
Чтобы составить список вершин в любом кластере, вы просто хотите найти, какие идентификаторы в membership
компоненте, упомянутом ранее, соответствуют данному кластеру. Поэтому, если я хочу найти вершины в кластере # 128 (их 21, согласно clusters(all2)$csize[129]
), я мог бы использовать:
which(clusters(all2)$membership == 128)
length(which(clusters(all2)$membership == 128)) #21
и для получения вершин в этом кластере я могу использовать функцию V
и передать только что вычисленные мной индексы, которые являются членами этого кластера:
> V(all2)[clusters(all2)$membership == 128]
Vertex sequence:
[1] "625591221 - Clare Clancy"
[2] "100000283016052 - Podge Mooney"
[3] "100000036003966 - Jennifer Cleary"
[4] "100000248002190 - Sarah Dowd"
[5] "100001269231766 - LirChild Surfwear"
[6] "100000112732723 - Stephen Howard"
[7] "100000136545396 - Ciaran O Hanlon"
[8] "1666181940 - Evion Grizewald"
[9] "100000079324233 - Johanna Delaney"
[10] "100000097126561 - Órlaith Murphy"
[11] "100000130390840 - Julieann Evans"
[12] "100000216769732 - Steffan Ashe"
[13] "100000245018012 - Tom Feehan"
[14] "100000004970313 - Rob Sheahan"
[15] "1841747558 - Laura Comber"
[16] "1846686377 - Karen Ni Fhailliun"
[17] "100000312579635 - Anne Rutherford"
[18] "100000572764945 - Lit Đ Jsociety"
[19] "100003033618584 - Fall Ball"
[20] "100000293776067 - James O'Sullivan"
[21] "100000104657411 - David Conway"
Это охватило бы основные вопросы, которые у вас возникали. Другие вопросы больше связаны с теорией графов. Я не знаю, как контролировать количество создаваемых кластеров с помощью iGraph, но кто-то может указать вам пакет, который может это сделать. Возможно, вам удастся опубликовать этот вопрос в качестве отдельного вопроса, либо здесь, либо в другом месте.
Что касается ваших первых моментов, когда вы хотите перебрать все возможные сообщества, я думаю, вы обнаружите, что это невозможно для графа значительного размера. Число возможных расположений вектора membership
для 5 различных кластеров будет равно 5 ^ n, где n - размер графика. Если вы хотите найти «все возможные сообщества», это число будет на самом деле O (n ^ n), если моя психическая математика верна. По сути, было бы невозможно рассчитать это исчерпывающе для любой сети разумного размера, даже учитывая огромные вычислительные ресурсы. Поэтому я думаю, что для определения количества сообществ, представленных на вашем графике, лучше использовать некую интеллектуальную информацию / оптимизацию, как это делает функция clusters
.