【问题标题】:multiple adjacency matrices for one edgelist R一个边缘列表 R 的多个邻接矩阵
【发布时间】:2017-02-03 16:21:39
【问题描述】:

我有以下边 list 和一个将边与路径号相关联的数字。这是由以下matrix 给出的,我称之为Totallist: `

Begin edge  end edge  path number
1               3           1
3               4           1
4               5           1
6               3           2
3               2           2`

我想为每个路径构建邻接matrices。在这个例子中,我想要两个matrices,但可能还有更多。我写了以下内容,但它只为第一条路径找到matrix。我不确定如何编写适用于我扔给它的任意数量的路径的东西:

 X<-as.data.frame(table(Totallist[,3]))

nlines<-nrow(X)
nlines
freq<-X[1,2]

diameterofmatrix<-max(Totallist)

X1<-get.adjacency(graph.edgelist(as.matrix(Totallist[1:X[1,2],1:2]), directed=FALSE))
X1<-rbind(X1, 0)
X1<-cbind(X1, 0)
X1

我还需要matrices 具有相同的维度,因此我添加了额外的行和列。我可以继续使用我的方法,但它看起来很丑。非常感谢您的帮助。

【问题讨论】:

    标签: r adjacency-list adjacency-matrix


    【解决方案1】:

    要将邻接矩阵提取到列表中,您可以执行以下操作(我生成了一些假数据):

    set.seed(42)
    df <- data.frame(beginEdge = sample(1:10, 10, replace = TRUE), 
                     endEdge = sample(1:10, 10, replace=TRUE), 
                     pathNum = rep(c(1,2), each=5))
    df
    
          beginEdge endEdge pathNum
    1         10       5       1
    2         10       8       1
    3          3      10       1
    4          9       3       1
    5          7       5       1
    6          6      10       2
    7          8      10       2
    8          2       2       2
    9          7       5       2
    10         8       6       2
    
    
    paths <- unique(df$pathNum) # get the paths to iterate through
    

    如果我们将节点设为因子,并将因子的级别设置为总体中的所有节点,那么将为您的网络中的总体计算邻接矩阵。我在这里假设网络是十个演员。如果您观察到的数据包含您想要使用的所有节点,请将级别设置为 unique(c(df$beginEdge,df$endEdge)),或者您喜欢的任何节点集。

    df$beginEdge <- factor(df$beginEdge, levels=1:10) 
    df$endEdge <- factor(df$endEdge, levels=1:10)
    

    我们现在遍历路径列表并创建将它们存储为列表的矩阵:

      list.of.adj.mats <- lapply(paths, function(i){
          matrix(as.numeric((
          table(df$beginEdge[df$pathNum==i],
            df$endEdge[df$pathNum==i])+
          table(df$endEdge[df$pathNum==i],
          df$beginEdge[df$pathNum==i]))>0), 
      nrow=length(levels(df$beginEdge)))})
    list.of.adj.mats
    [[1]]
          [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
     [1,]    0    0    0    0    0    0    0    0    0     0
     [2,]    0    0    0    0    0    0    0    0    0     0
     [3,]    0    0    0    0    0    0    0    0    1     1
     [4,]    0    0    0    0    0    0    0    0    0     0
     [5,]    0    0    0    0    0    0    1    0    0     1
     [6,]    0    0    0    0    0    0    0    0    0     0
     [7,]    0    0    0    0    1    0    0    0    0     0
     [8,]    0    0    0    0    0    0    0    0    0     1
     [9,]    0    0    1    0    0    0    0    0    0     0
    [10,]    0    0    1    0    1    0    0    1    0     0
    
    [[2]]
          [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
     [1,]    0    0    0    0    0    0    0    0    0     0
     [2,]    0    1    0    0    0    0    0    0    0     0
     [3,]    0    0    0    0    0    0    0    0    0     0
     [4,]    0    0    0    0    0    0    0    0    0     0
     [5,]    0    0    0    0    0    0    1    0    0     0
     [6,]    0    0    0    0    0    0    0    1    0     1
     [7,]    0    0    0    0    1    0    0    0    0     0
     [8,]    0    0    0    0    0    1    0    0    0     1
     [9,]    0    0    0    0    0    0    0    0    0     0
    [10,]    0    0    0    0    0    1    0    1    0     0
    

    【讨论】:

    • 非常感谢您的回复。只需查看您的答案给出的邻接矩阵,我相信它们应该沿对角线对称。换句话说,条目 [i,j]= 条目 [j,i]。您的答案似乎不是这种情况?
    • 您给出的示例是计算一个无向邻接矩阵,因此它不必是对称的 - 我生成的矩阵对无向邻接矩阵中所需的所有信息进行编码以表示路径。但是,我编辑了代码以生成对称矩阵,以防万一你需要(尽管它使它有点混乱)。
    • 非常感谢,我应该提到我需要对称相邻矩阵。
    猜你喜欢
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    相关资源
    最近更新 更多