我有一个嵌套列表,我想创建一个网络对象,其中存在于子列表中的是一个链接。
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")
欢迎您的帮助!
答案 0 :(得分:0)
希望为您工作:
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
软件包不太熟悉。可能会有更简单的解决方案。