【问题标题】:From list to adjacency matrix从列表到邻接矩阵
【发布时间】:2016-04-02 20:16:19
【问题描述】:

我有一个这样的列表:

> print(list)
[[1]]
[1] 1

[[2]]
[1] 4

[[3]]
[1] 1

[[4]]
[1] 2

[[5]]
[1] 2

[[6]]
[1] 3

[[7]]
[1] 2

[[8]]
[1] 5

[[9]]
[1] 1

[[10]]
[1] 2

[[11]]
[1] 3

[[12]]
[1] 7

[[13]]
[1] 3

[[14]]
[1] 4

[[15]]
[1] 3

[[16]]
[1] 5

[[17]]
[1] 1

[[18]]
[1] 1

[[19]]
[1] 4

[[20]]
[1] 6

现在我想把这个列表变成一个邻接矩阵,这样我就可以构建一个不简单的非直接图(可能存在多链接和自循环)。

这个列表应该成对读取,即(1 4)表示存在从节点1到节点4的链接,对(1 2)表示存在从节点1到节点2的链接,以此类推。

我该怎么做?

我以为我用 step = 2 的 for 循环来迭代列表,但我还没有找到怎么做。 而且我不确定如何分配矩阵的值,我分配给多链接什么?

非常感谢

【问题讨论】:

  • 您可以使用matrix(unlist(list), ncol=2) 轻松创建边缘列表您是否使用igraph 之类的库?我不完全理解所需的输出是什么。
  • @MrFlick 感谢您的回复。是的,我正在使用 igraph。不,我没有矩阵。我只有代表链接的列表(成对阅读时)。我没有从数组或图表生成列表。我只有那个清单。

标签: r adjacency-matrix


【解决方案1】:

这是另一种方式

lst <- list(1, 4, 1, 2, 2, 3, 2, 5, 1, 2, 3, 7, 3, 4, 3, 5, 1, 1, 4, 6)
library(igraph)
g <- make_graph(unlist(lst), directed = F)
( m <- as_adjacency_matrix(g, sparse = F) ) 
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
# [1,]    1    2    0    1    0    0    0
# [2,]    2    0    1    0    1    0    0
# [3,]    0    1    0    1    1    0    1
# [4,]    1    0    1    0    0    1    0
# [5,]    0    1    1    0    0    0    0
# [6,]    0    0    0    1    0    0    0
# [7,]    0    0    1    0    0    0    0

【讨论】:

    【解决方案2】:

    我怀疑你正在寻找这样的东西:

    # Input
    my_list <- list(1, 4, 1, 2, 2, 3, 2, 5, 1, 2, 3, 7, 3, 4, 3, 5, 1, 1, 4, 6)
    
    # Make to vector
    my_list <- unlist(my_list)
    
    # Number of vertices in graph (may change this to any number > max(my_list))
    num_vertices <- max(my_list)
    
    # Number of edges
    num_edges <- length(my_list) / 2
    
    # Transform edge data into data.frame, each row is an edge
    edges <- data.frame(tails = my_list[rep(c(TRUE, FALSE), num_edges)],
                        heads = my_list[!rep(c(TRUE, FALSE), num_edges)])
    
    # Count duplicate edges (if multi-edges should not be allowed, set count to 1)
    edges$count <- ave(rep(1, num_edges), edges, FUN = base::sum)
    
    # Remove duplicate edges, count encodes multi-edges
    edges <- edges[!duplicated(edges), ]
    
    # Make empty adjacency matrix
    adjacency_matrix <- matrix(0, ncol = num_vertices, nrow = num_vertices)
    
    # Populate matrix
    adjacency_matrix[as.matrix(edges[, c("heads", "tails")])] <- edges$count
    
    # Make graph undirected
    adjacency_matrix <- adjacency_matrix + t(adjacency_matrix) - diag(diag(adjacency_matrix))
    

    顺便说一句,list 可能不是列表的最佳名称。

    【讨论】:

    • 我收到此错误Error in get(as.character(FUN), mode = "function", envir = envir) : object 'FUN' of mode 'function' was not found
    • @marielle 您可能已经覆盖了sum 函数。 R 允许您覆盖任何可能使代码不可预测的内容,就像在这种情况下一样。尝试替换为edges$count &lt;- ave(rep(1, num_edges), edges, FUN = base::sum)。我也更改了原始代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    相关资源
    最近更新 更多