我对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
我们假设,如果两个元素属于同一组,即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)