Сформировать вложенный список в сетевой объект - PullRequest
0 голосов
/ 24 октября 2018

У меня есть вложенный список, я хочу создать сетевой объект, в котором присутствие в подсписке представляет собой ссылку.

tmp <- list(c("A","B","C"), c("B","D"), c("B"))

Ожидаемый результат:

netmat1 <- rbind(c(0,1,1,0), c(1,0,1,1), c(1,1,0,0),c(0,1,0,0))
rownames(netmat1) <- c("A","B","C","D") 
colnames(netmat1) <- c("A","B","C","D")

Созданиесетевой объект в формате списка границ может быть простым.Это подразумевало бы разделение каждого элемента tmp на уникальные пары (неупорядоченные) и отбрасывание отдельных элементов:

tmp_prime <- list(c(A,B),c(A,C),c(A,C),c(B,D))
net <- network(tmp_prime,matrix.type="edgelist")

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 24 октября 2018

Надеюсь, что эта работа для вас:

library(network)
x <- do.call(cbind, lapply(tmp[lengths(tmp) > 1], combn, 2))
net <- network(t(x), matrix.type = 'edgelist', directed = F)

# > as.matrix(net)
#   A B C D
# A 0 1 1 0
# B 1 0 1 1
# C 1 1 0 0
# D 0 1 0 0

lapply(tmp[lengths(tmp) > 1], combn, 2) создаст ребра для каждого элемента списка с как минимум 2 значениями.do.call(cbind, ...) свяжет все ребра в двух единых матрицах (каждый столбец является ребром).Ниже показано, как выглядит t(x):

# > t(x)
#      [,1] [,2]
# [1,] "A"  "B" 
# [2,] "A"  "C" 
# [3,] "B"  "C" 
# [4,] "B"  "D"

Тогда вы можете легко получить ненаправленную сеть с network из пакета network.Я не очень знаком с пакетом network.Там могут быть более простые решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...