一个边列表R的多重邻接矩阵

一个边列表R的多重邻接矩阵,r,adjacency-list,adjacency-matrix,R,Adjacency List,Adjacency Matrix,我有下面的边列表,其编号将边与路径号关联。这由以下矩阵给出,我称之为totalist: ` 我想为每个路径构造邻接矩阵。在本例中,我想要两个矩阵,但可能还有更多。我已经写了以下内容,但它只找到第一条路径的矩阵。我不确定如何编写适用于任意数量路径的内容: X<-as.data.frame(table(Totallist[,3])) nlines<-nrow(X) nlines freq<-X[1,2] diameterofmatrix<-max(Totallist)

我有下面的边
列表
,其编号将边与路径号关联。这由以下矩阵给出,我称之为totalist: `

我想为每个路径构造邻接矩阵。在本例中,我想要两个
矩阵
,但可能还有更多。我已经写了以下内容,但它只找到第一条路径的
矩阵
。我不确定如何编写适用于任意数量路径的内容:

 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

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

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

  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
list.of.adj.mats 0),
nrow=长度(级别(df$beginEdge))})
垫子清单
[[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]。你的答案似乎不是这样的?你给出的例子是计算一个无向邻接矩阵,所以它不必是对称的-我生成的矩阵编码了无向邻接矩阵中表示路径所需的所有信息。但是,我编辑了代码以生成对称矩阵,以防这是您需要的(尽管这使它变得有点混乱)。非常感谢,我应该提到我需要对称相邻矩阵。
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
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