识别和汇总R中的离散节点组

时间:2018-10-16 11:32:59

标签: r igraph sna statnet

我正在研究与家庭/家庭组成有关的网络问题。我有多个包含id1,id2和关系代码的边缘表,用于声明身份变量之间的关系类型。这些表很大,每个表超过700万行。我也有一个节点表,其中包含相同的ID和各种属性。

我要实现的是一个邻接矩阵,该矩阵将提供类似于以下内容的摘要统计信息:

                      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 :(得分:1)

要获得最终表所需的一些工作 访问您未显示给我们的节点表,但我可以使您变得漂亮 远在您的问题上。

我认为获得结果的关键是确定住户。 您可以使用igraphcomponents中进行此操作。连接的组件是家庭。 我将以稍微更详尽的示例进行说明。

数据:

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

在我的虚假示例中,所有家庭都有两个成年人。