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

Identifying and summarizing discrete groups of nodes in R

我正在处理与 family/household 合成相关的网络问题。我有多个边 tables 包含 id1、id2 和一个关系代码来说明身份变量之间的关系类型。这些 table 很大,每行超过 700 万行。我还有一个节点 table,它包含相同的 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
               .    .     .
               .    .     .
               .    .     . 

我还有一个节点 table,其中包含出生日期和其他可以识别 adult/child 状态的变量。

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

谢谢

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

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

你说你可以标记节点是否代表 成人或儿童。我假设我们有这样的标签。 由此,很容易按家庭和 按家庭划分的儿童并进行 table 家庭分解 成人和儿童。

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

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