Отображение крайних списков в матрицу смежности (и суммирование их вместе) - PullRequest
0 голосов
/ 15 ноября 2018

Я хочу отобразить количество (неориентированных) сетей дружбы (в формате пограничного списка) в матрицу смежности, состоящую из всех возможных узлов (то есть лиц), используя R. Для начала я создаю меньший круг из 4 человек x <- c(1, 2, 3, 4), который состоит из 6 уникальных ребер (1-2, 1-3, 1-4, 2-3, 2-4, 3-4). Затем я свел этот набор из 6 уникальных ребер в один список, так что его можно преобразовать в симметричную матрицу с помощью приложений igraph (см. Ниже).

x = c(1,2,3,4)
x_pairs = combn(x, 2)
List <- split(x_pairs, rep(1:ncol(x_pairs), each = nrow(x_pairs)))
library(purrr)
new_list <- purrr::flatten(List)
g <- make_graph(unlist(new_list), directed = F)
m <- as_adjacency_matrix(g, sparse = F)
m

     [,1] [,2] [,3] [,4]
[1,]    0    1    1    1
[2,]    1    0    1    1
[3,]    1    1    0    1
[4,]    1    1    1    0

В моем наборе данных более одного из таких небольших кружков дружбы, состоящих из 50 человек, и членство в этих кругах может совпадать или не совпадать. Поэтому мой вопрос заключается в том, как я могу отобразить серию меньших значений матрицы, таких как m выше, в матрицу смежности 50 на 50 двумя различными способами:

(1) без повторения: скажем, если 3 и 4 являются друзьями в одном круге, но они также связаны в другом круге, грань между 3 и 4 должна оставаться 1 (но не суммировать до 2) (2) кумулятивно: если отношение во множественных кругах указывает на более сильную дружбу, то может быть более информативно отобразить эти кружки в матрицу взвешенной смежности, где каждая ячейка в матрице представляет совокупное число дружбы идентификатора строки и столбца в разных кругах. В ситуациях 3 и 4 их граничное значение должно быть 1 + 1 = 2.

Я проверил эту и другие предыдущие темы, но, похоже, не могу понять, как это сделать, будет очень признателен, если кто-нибудь сможет просветить меня в этом.

1 Ответ

0 голосов
/ 17 ноября 2018

Существуют различные способы достижения этого.Похоже, что делать это в терминах теории графов в igraph немного сложнее, чем иметь дело непосредственно с матрицами смежности.Пусть

circles <- list(1:3, 2:4) # Friendship circles with identities 1, ..., n
n <- max(unlist(circles)) # Total number of people
nM <- matrix(0, n, n) # n x n matrix of zeroes

Тогда

adjs <- lapply(circles, function(cr) {nM[cr, cr] <- 1; nM[cbind(cr, cr)] <- 0; nM})

- это список nxn матриц смежности для каждого круга дружбы (в большинстве случаев нули в каждом случае).

Тогда два типасовокупные матрицы могут быть получены с помощью

(adj1 <- Reduce(`+`, adjs))
#      [,1] [,2] [,3] [,4]
# [1,]    0    1    1    0
# [2,]    1    0    2    1
# [3,]    1    2    0    1
# [4,]    0    1    1    0
(adj2 <- 1 * (adj1 > 0))
#      [,1] [,2] [,3] [,4]
# [1,]    0    1    1    0
# [2,]    1    0    1    1
# [3,]    1    1    0    1
# [4,]    0    1    1    0
...