0

我正在研究与家庭/家庭组成有关的网络问题。我有多个包含 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
               .    .     .
               .    .     .
               .    .     . 

我还有一个节点表,其中包含出生日期和可以识别成人/儿童状态的其他变量。

任何有关如何从图形数据框中提取此摘要信息的提示/提示都将非常有帮助并非常感谢。

谢谢

4

1 回答 1

2

获得您想要的最终表所需的一些工作需要访问您没有向我们展示的节点表,但我可以让您在您的问题中走得更远。

我认为获得结果的关键是确定家庭。您可以在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])

家庭网络

您说您可以标记节点,以确定它们代表成人还是儿童。我会假设我们有这样的标签。由此,很容易按家庭计算成人人数和按家庭儿童人数,并制作成人和儿童家庭分解表。

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

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

于 2018-10-16T14:19:27.723 回答