使用组信息建立邻接矩阵

问题描述 投票: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

我需要创建一个邻接矩阵,如果一个hihid在同一个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
r igraph adjacency-matrix adjacency-list
1个回答
0
投票

我们假设,如果两个元素属于同一组,即dist和village,则它们被视为相邻。

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

m1 <- sign(crossprod(t(DF[4:7])))
m2 <- sign(crossprod(t(model.matrix(~ factor(distid) + 0, DF))))
m3 <- sign(crossprod(t(model.matrix(~ factor(villageid) + 0, DF))))
m4 <- 1 - diag(nrow(DF))
m1 * m2 * m3 * m4

给予:

  1 2 3 4 5 6 7 8
1 0 1 0 0 0 0 0 0
2 1 0 0 0 0 0 0 0
3 0 0 0 1 0 0 0 0
4 0 0 1 0 0 0 0 0
5 0 0 0 0 0 1 0 0
6 0 0 0 0 1 0 0 0
7 0 0 0 0 0 0 0 1
8 0 0 0 0 0 0 1 0

注意

可复制形式的输入。

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)
© www.soinside.com 2019 - 2024. All rights reserved.