R: Постройте знаменитые 6 степеней разделения (Кевин Бэкон)

Я пытаюсь написать код R, который показывает степень разделения между друзьями. То есть, предположим, что я выбираю узел со стрелкой, указывающей на него, и говорю степень = 3, я хотел бы иметь возможность идентифицировать следующий путь в этой сети:  введите описание изображения здесь

Думаю, я нашел предыдущий пост о stackoverflow, который отвечает на аналогичный вопрос: R Подграф Igraph с заданным индексом узла и количеством узлов, которые нужно включить в граф

Предположим, я создаю фальшивые сетевые данные:

library(igraph)
file <-data.frame(
    
    "source" = c(
        "John",
        "John",
        "Tim",
        "Tim",
        "Alex",
        "Andrew",
        "Andrew",
        "Andrew",
        "Oliver",
        "Oliver",
        "Oliver",
        "Matt",
        "Steven",
        "Steven",
        "Steven",
        "Matt",
        "Charles",
        "Charles",
        "Charles",
        "Sean",
        "Ted",
        "Ryan",
        "Ryan",
        "Ryan",
        "Ted",
        "Phil",
        "Phil",
        "Phil",
        "Sam",
        "Toby",
        "Toby",
        "Donald",
        "Donald",
        "Donald",
        "Mitch",
        "Mitch",
        "Mitch"),
    
    "target" = c("Sam",
                 "Tim",
                 "Alex",
                 "Matt",
                 "Andrew",
                 "Sean",
                 "Peter",
                 "Ben",
                 "Kevin",
                 "Thomas",
                 "Dave",
                 "Steven",
                 "Kenny",
                 "Derek",
                 "CJ",
                 "Charles",
                 "Ivan",
                 "Kyle",
                 "Andrew",
                 "Ted",
                 "Ryan",
                 "Daniel",
                 "Chris",
                 "Scott",
                 "Phil",
                 "Henry",
                 "George",
                 "Paul",
                 "Toby",
                 "Donald",
                 "Mitch",
                 "Jack",
                 "Luke",
                 "Myles",
                 "Elliot",
                 "Harvey",
                 "Owen")
    
)

graph <- graph.data.frame(file, directed=F)
graph <- simplify(graph)
plot(graph)

Это правильный код для построения трех степеней разделения для Джона?

distan <- 3

subnetwork <- induced.subgraph(graph, vids = as.vector(unlist(neighborhood(graph, distan, nodes = "John", mode = 'all'))))

plot(subnetwork)

Есть ли способ узнать, у кого больше всего друзей в этой сети? (узел с наибольшим количеством подключений)

Спасибо


person Community    schedule 22.11.2020    source источник


Ответы (1)


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

distan <- 3
subnetwork <- induced.subgraph(graph, unlist(ego(graph, order=3, nodes="John"))) 

Чтобы узнать, у кого больше всего друзей, используйте функцию степени.

degree(graph)
   John     Tim    Alex  Andrew  Oliver    Matt  Steven Charles    Sean     Ted 
      2       3       2       5       3       3       4       4       2       3 
   Ryan    Phil     Sam    Toby  Donald   Mitch   Peter     Ben   Kevin  Thomas 
      4       4       2       3       4       4       1       1       1       1 
   Dave   Kenny   Derek      CJ    Ivan    Kyle  Daniel   Chris   Scott   Henry 
      1       1       1       1       1       1       1       1       1       1 
 George    Paul    Jack    Luke   Myles  Elliot  Harvey    Owen 
      1       1       1       1       1       1       1       1 

У Андрея больше всего друзей.

person G5W    schedule 23.11.2020
comment
Спасибо! Не могли бы вы взглянуть на этот вопрос: stackoverflow.com / questions / 64961299 / Означает ли это, что первое сообщество является значимым? Спасибо - person ; 23.11.2020
comment
Спасибо ... Последний вопрос: предположим, есть 3 сообщества. Есть ли способ узнать, какое сообщество самое важное? - person ; 23.11.2020
comment
Вам нужно было бы дать определение важности - и я не думаю, что для этого существует какое-то одно определение. Это может быть самое большое сообщество, но могут быть графики, на которых небольшое сообщество соединяет вместе два больших сообщества. Маленький важен для поддержания связи. - person G5W; 23.11.2020
comment
D = Степень (график) ... есть ли способ лучше организовать это? Градус = таблица (Градус (график))? ... есть ли способ отсортировать D? - person ; 23.11.2020
comment
Конечно. просто sort(D) - person G5W; 23.11.2020
comment
По другому вопросу добавлю комментарий. - person G5W; 23.11.2020
comment
Еще раз спасибо ... есть ли у вас какие-либо представления о другом вопросе, оставленном в обсуждении? есть ли способ узнать, какие сообщества связаны друг с другом? (т.е. после того, как с сообществом был заключен контракт, можете ли вы увидеть, какие другие сообщества к нему подключены?) ... Очень признателен - person ; 23.11.2020