R 利用群信息生成邻接矩阵

R 利用群信息生成邻接矩阵,r,igraph,adjacency-matrix,adjacency-list,R,Igraph,Adjacency Matrix,Adjacency List,我对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

我对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和group中,那么它们都是完全连接的

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

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)
图表
库(igraph)

g“第一组在地区一级”意味着什么?所示的邻接矩阵是不对称的。请澄清并修正问题。我已编辑了问题。我需要创建一个邻接矩阵,如果hhid在同一个distid中,villageid具有相同的从属关系,那么它是连接的。谢谢,这非常有效。我有一个关于尺寸的问题。当使用(t(DF[4:7])时,我得到7是数据帧中变量的数量,但为什么使用4作为行。是组数吗?
t(DF[4:7])
是4x8矩阵,而不是数据帧。如果我们称之为
M
,那么
crossprod(M[,i],M[,j])
DF
的第i行和第j行中hhid的共同组数。例如,对于i=2和j=3,它给出了2,因为DF的第2行和第3行中的hhid有两个共同的组(组1和组2)。感谢您的解释。对此我还是有点不确定。我的完整数据集有247个hhid和15个组。那么我的矩阵应该是t(DF[4:14])吗?m1仅从组列中导出。我已经更改了索引以排除前三列,因此如果您有不同数量的组列,只要组列是除前三列以外的所有列,就不需要更改它。
> 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)