Составление матрицы смежности с использованием групповой информации - PullRequest
1 голос
/ 18 февраля 2020

Я относительно новичок в 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

1 Ответ

1 голос
/ 19 февраля 2020

Мы предполагаем, что требуется, чтобы два элемента считались смежными, если они находятся в одной группе, 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)

screenshot

Примечание

Ввод в воспроизводимом виде.

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)
...