【问题标题】:R: Adjacency list to Adjacency matrixR:邻接矩阵的邻接列表
【发布时间】:2015-05-31 04:47:21
【问题描述】:

您好,我想将邻接列表(3 列)转换为邻接矩阵。在这个论坛中,我找到了多个关于如何将边列表转换为邻接矩阵的示例。我成功地为两列列表做到了这一点。 我已经尝试了所有可以在网上找到的解决方案,但似乎我错过了一小步。

我尝试了什么

我的变量是用户、国家、书籍

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

任何帮助或指示将不胜感激!!!

【问题讨论】:

    标签: r matrix igraph adjacency-list adjacency-matrix


    【解决方案1】:

    也许这就是你所追求的:

    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     .      .      .   .       .      .      .       .          .
    

    【讨论】:

    • 完美!!!它正在工作:) 我也想了解您的代码。你能从 graph.edgelist(........) 解释一下吗?
    • 我只是在行数优于三的时候尝试过,并没有产生矩阵。有没有办法创建邻接矩阵?
    • @Shean10000 - 以下 5x3 矩阵示例适用于我:m &lt;- replicate(3, sample(letters, 5)); get.adjacency(graph.edgelist(cbind(m[, 1], c(m[, -1]))))
    • @Shean10000 - 我现在让事情变得更清楚了。
    • 我已经为矩阵 m 尝试过这个:m
    猜你喜欢
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    相关资源
    最近更新 更多