Выявление и суммирование дискретных групп узлов в R - PullRequest
0 голосов
/ 16 октября 2018

Я работаю над проблемой сети, связанной с составом семьи / домашнего хозяйства.У меня есть несколько таблиц ребер, содержащих id1, id2 и код отношения, чтобы указать тип отношения между переменными идентичности.Эти таблицы большие, по 7 миллионов строк в каждой.У меня также есть таблица узлов, которая содержит тот же идентификатор и различные атрибуты.

Я хочу достичь матрицы смежности, которая даст сводную статистику, похожую на что-то вроде этого:

                      Children

             1  2  3  4   total 
            --------------------
          1 | 1  0  1  0    2
            |
 Adults   2 | 3  5  4  1    13  
            |
          3 | 1  2  0  0    3
            |
      total | 5  7  5  1    18 

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

Мои данные имеют вид:

             ID1  ID2   Relationship_Code

              X1   X2    Married 
              X1   X3    Parent/Child
              X1   X4    Parent/Child 
              X5   X6    Married
              X5   X7    Parent/Child 
              X6   X5    Married
               .    .     .
               .    .     .
               .    .     . 

У меня также есть таблица узлов, которая содержит дату рождения и другие переменные, по которым можно определить статус взрослого / ребенка.

Любые советы / подсказки о том, как извлечь эту сводную информацию из фрейма данных графика, были бы очень полезны и получили бы высокую оценку.

Спасибо

1 Ответ

0 голосов
/ 16 октября 2018

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

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

Данные:

Census = read.table(text="ID1  ID2   Relationship_Code
              X1   X2    Married 
              X2   X1    Married 
              X1   X3    Parent/Child
              X1   X4    Parent/Child 
              X2   X3    Parent/Child
              X2   X4    Parent/Child 
              X5   X6    Married
              X5   X7    Parent/Child 
              X6   X7    Parent/Child 
              X6   X5    Married
              X8   X9    Married
              X9   X8    Married",
    header=T)

Теперь превратите его в график, найдите компоненты и проверьте на графике.

library(igraph)
EL = as.matrix(Census[,1:2])
Pop = graph_from_edgelist(EL)
Households = components(Pop)
plot(Pop, vertex.color=rainbow(3, alpha=0.5)[Households$membership])

Household network

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

V(Pop)$AdultChild = c('A', 'A', 'C', 'C', 'A', 'A', 'C', 'A', 'A')
AdultsByHousehold = aggregate(V(Pop)$AdultChild, list(Households$membership), 
    function(p) sum(p=='A'))
AdultsByHousehold
  Group.1 x
1       1 2
2       2 2
3       3 2

ChildrenByHousehold = aggregate(V(Pop)$AdultChild, list(Households$membership), 
    function(p) sum(p=='C'))
ChildrenByHousehold
  Group.1 x
1       1 2
2       2 1
3       3 0

table(AdultsByHousehold$x, ChildrenByHousehold$x)
    0 1 2
  2 1 1 1

В моем поддельном примере во всех домохозяйствах есть два взрослых,

...