使用组信息制作邻接矩阵

Making adjacency matrix using group information

我对 R 比较陌生,在使用组特征创建邻接矩阵时遇到问题。

我有一个如下所示的数据框:

distid villageid  hhid group1 group2 group3 group4 
1        1         111  0        1     0        0
1        1         112  1        1     1        0
1        2         121  1        1     0        1 
1        2         122  1        0     0        1
2        1         211  1        1     0        0
2        1         212  1        1     1        1
2        2         221  0        0     1        0
2        2         222  0        1     1        0

我需要创建一个邻接矩阵,如果 hhid 在同一个 distid、villageid 和组中,那么它们都是完全连接的。

所以我的最终矩阵应该是这样的

hhid  111    112  121   122    211   212   221 222
111    0     1     0     0       0    0     0   0
112    1     0     0     0       0    0     0   0  
121    0     0     0     1       0    0     0   0
122    0     0     0     0       0    0     0   0 
211    0     0     0     0       0    1     0   0
212    0     0     0     0       1    0     0   0 
221    0     0     0     0       0    0     0   1
222    0     0     0     0       0    0     1   0

我们假设想要的是,如果两个元素在同一个组dist和village中,则认为它们是相邻的。

使用注释中的输入为组、distid 和 villageid 创建邻接矩阵,然后将它们相乘并将对角线归零。

m1 <- sign(crossprod(t(DF[-(1:3)])))
m2 <- +outer(DF$distid, DF$distid, "==")
m3 <- +outer(DF$villageid, DF$villageid, "==")
m4 <- 1 - diag(nrow(DF))
m <- m1 * m2 * m3 * m4
dimnames(m) <- list(DF$hhid, DF$hhid)

给予:

> m
    111 112 121 122 211 212 221 222
111   0   1   0   0   0   0   0   0
112   1   0   0   0   0   0   0   0
121   0   0   0   1   0   0   0   0
122   0   0   1   0   0   0   0   0
211   0   0   0   0   0   1   0   0
212   0   0   0   0   1   0   0   0
221   0   0   0   0   0   0   0   1
222   0   0   0   0   0   0   1   0

图表

library(igraph)
g <- graph_from_adjacency_matrix(m)
plot(g)

备注

可重现形式的输入。

Lines <- "distid villageid  hhid group1 group2 group3 group4 
1        1         111  0        1     0        0
1        1         112  1        1     1        0
1        2         121  1        1     0        1 
1        2         122  1        0     0        1
2        1         211  1        1     0        0
2        1         212  1        1     1        1
2        2         221  0        0     1        0
2        2         222  0        1     1        0"
DF <- read.table(text = Lines, header = TRUE)