Я хочу отобразить количество (неориентированных) сетей дружбы (в формате пограничного списка) в матрицу смежности, состоящую из всех возможных узлов (то есть лиц), используя 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.
Я проверил эту и другие предыдущие темы, но, похоже, не могу понять, как это сделать, будет очень признателен, если кто-нибудь сможет просветить меня в этом.