将嵌套列表形成网络对象

时间:2018-10-24 11:12:01

标签: r networking nested

我有一个嵌套列表,我想创建一个网络对象,其中存在于子列表中的是一个链接。

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 :(得分: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软件包不太熟悉。可能会有更简单的解决方案。