R: 邻接表转邻接矩阵

3
你好,我希望将一个邻接列表(3列)转换为邻接矩阵。在这个论坛上,我找到了多个关于如何将边缘列表转换为邻接矩阵的示例。我成功地将两列列表转换为邻接矩阵。我尝试了我能在网上找到的所有解决方案,但似乎我还缺少一点步骤。

我的尝试

我的变量是User、Country和books。

User<-c("maman","sophia","Antoine")  
Country<-c("Canada","USA","Mexico")  
books<-c("Coelho","Rimbaud","The flight") 
dat<-data.frame(User, Country,books)  


User |       Country | books   
maman |        Canada  |    Coelho   
sophia|          USA  |    Rimbaud  
Antoine|     Mexico  | The flight

首次尝试

library(igraph)     
m<-as.matrix(dat)    
g<-graph.adjacency(m, mode="directed") ### If that worked I could have used      
"get.adjacency" 

第二次尝试

我试图将数据转换为边列表,但由于有三列,所以出现了错误。

el<-as.matrix(dat)       
g=graph.edgelist(el,directed=TRUE) # turns   

期望输出

     maman sophia Antoine Canada USA Mexico Coelho Rimbaud The fligth
maman    1   0     1       0      0   0      0        1          0
sophia   0   0     0       0      1   0      1        0          1
Antoine  0   1     1       0      1   0      0        1          0
Canada   1   0     1       0      0   1      0        1          1
 USA     0   0     0       1      0   0      0        0          1
 Mexico  0   0     0       0      1   1      1        0          0 
Coelho   0   0     1       1      0    1      0       1          0
Rimbaud  1   0     1       1      0    0      0       1          1
The fligth 0 1     0       0      1    1      0       0          1

我想查看所有顶点之间的交互情况。类似于这个: http://sna.stanford.edu/sna_R_labs/output/lab_1/1.3_Krackhardt_Friendship.pdf。任何帮助或指示将不胜感激!!!
1个回答

4
也许这就是你想要的内容:
m <- as.matrix(dat)
el <- cbind(m[, 1], c(m[, -1]))

这里,el是一个边缘列表,它是通过将矩阵m的第一列与一个向量绑定而创建的,该向量是通过删除子集矩阵m[, 2:3](等同于m[, -1])的维度得出的。请注意,在cbind中的第一个向量有3个元素,而第二个向量有6个元素。第一个向量将被循环使用到与第二个向量相同的长度。我们所做的就相当于执行cbind(rep(m[, 1], 2), m[, -1])

以下是我们的边缘列表的样子。

el
##      [,1]      [,2]        
## [1,] "maman"   "Canada"    
## [2,] "sophia"  "USA"       
## [3,] "Antoine" "Mexico"    
## [4,] "maman"   "Coelho"    
## [5,] "sophia"  "Rimbaud"   
## [6,] "Antoine" "The flight"

我们可以通过使用graph.edgelist将边列表绘制成图形,并使用get.adjacency提取邻接矩阵。
get.adjacency(graph.edgelist(el))

## 9 x 9 sparse Matrix of class "dgCMatrix"
##            maman Canada sophia USA Antoine Mexico Coelho Rimbaud The flight
## maman          .      1      .   .       .      .      1       .          .
## Canada         .      .      .   .       .      .      .       .          .
## sophia         .      .      .   1       .      .      .       1          .
## USA            .      .      .   .       .      .      .       .          .
## Antoine        .      .      .   .       .      1      .       .          1
## Mexico         .      .      .   .       .      .      .       .          .
## Coelho         .      .      .   .       .      .      .       .          .
## Rimbaud        .      .      .   .       .      .      .       .          .
## The flight     .      .      .   .       .      .      .       .          .

我刚尝试了一下,当行数超过三时,它不会产生矩阵。是否有办法创建邻接矩阵? - Shean10000
@Shean10000 - 下面这个5x3矩阵的例子对我有效:m <- replicate(3, sample(letters, 5)); get.adjacency(graph.edgelist(cbind(m[, 1], c(m[, -1])))) - jbaums
我已经尝试过对矩阵m进行如下操作:m <- replicate(3, sample(dat, 6));我添加了另外三行代码。str(dat)显示有3个变量和6个观测值。但是我遇到了这个错误:"Error in sample.int(length(x), size, replace, prob) : cannot take a sample larger than the population when 'replace = FALSE"。 - Shean10000
@Shean10000 - 这是一个无关的错误,告诉你正在尝试对比数据框具有的列进行采样。如果您可以构建一个我的解决方案不适用的数据框,请在此处发布,我会查看一下。(顺便说一句,您可以使用反引号(shift+~)将文本格式化为注释中的代码...请参见此链接获取更多信息。) - jbaums
@Shean10000 - replicate与问题无关,我只是用它来简洁地创建一些随机数据。我也可以使用data.frame(sample(letters, 5), sample(letters, 5), sample(letters, 5)) - jbaums
显示剩余2条评论

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