Часть работы, которая требуется для получения финальной таблицы, которую вы хотите, требует доступа к таблице узлов, которую вы нам не показываете, но я могу помочь вам в решении вашей проблемы.
Я думаю, что ключом к получению вашего результата является идентификация домохозяйств.Вы можете сделать это в 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
В моем поддельном примере во всех домохозяйствах есть два взрослых,