一个edgelist R可以有多个邻接矩阵

3

我有以下带有路径编号的边缘列表 list。这是由下面称为Totallistmatrix给出的:

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

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

 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

我需要所有的矩阵都具有相同的维度,因此我添加了一行和一列。我可以继续使用我的方法,但看起来很丑陋。非常感谢您的帮助。
1个回答

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]项。但是在您的答案中似乎并非如此? - ushham
你提供的例子是计算一个无向邻接矩阵,因此它不必是对称的 - 我生成的矩阵编码了表示路径所需的所有无向邻接矩阵信息。然而,我编辑了代码以生成对称矩阵,以防您需要这样做(尽管这会使它变得有点混乱)。 - gfgm
非常感谢,我应该提到我需要对称相邻矩阵。 - ushham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接