我正在研究与家庭/家庭组成有关的网络问题。我有多个包含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
. . .
. . .
. . .
我还有一个节点表,其中包含生日和其他变量,可以从中识别成人/儿童的状态。
关于如何从图形数据框中提取此摘要信息的任何提示/提示都将非常有帮助,也将不胜感激。
谢谢
答案 0 :(得分:1)
要获得最终表所需的一些工作 访问您未显示给我们的节点表,但我可以使您变得漂亮 远在您的问题上。
我认为获得结果的关键是确定住户。
您可以使用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
在我的虚假示例中,所有家庭都有两个成年人。