【问题标题】:Weighted Adjacency matrix igraph and R加权邻接矩阵 igraph 和 R
【发布时间】:2014-12-11 16:43:50
【问题描述】:

我想请你帮忙。我有一个类似于下面的数据结构:

  ID    Name
  1      A
  2      B
  1      C
  1      B
  2      C
  2      D
  3      A
  3      B 

“ID”列是论文的唯一标识符,“Name”列代表与论文有合作的作者的姓名。我需要生成一个无向的加权邻接矩阵。矩阵中的节点(或顶点)将是“名称”列中的作者(ij)对。矩阵 (ij, i≠j) 中的加权值将由协作率的总和给出,使用的算法我可以用一个例子来描述:

例如,上面数据中的 A-B 对在论文“1”和“3”中有两个合作。此外,论文 1 有 3 个合作者(A、B、C);论文 3 有 2 个合作者(A,B)。节点 AB 的权重将是 A 和 B 共同参与的列 ID 中每篇论文的合作者数量的倒数之和减去 1。即,

                                    Paper 1          Paper 3
                   Collaborators   A, B, C = 3      A, B = 2
                   Weight          1 / (3 - 1)     1 / (2 - 1)

权重之和(AB) = (1/2)+(1) = (3/2)
请注意,如果 A 和 B 在一篇论文中合作,则分子将为 1,否则为 0。算法的关键是计算“名称”列中每对作者的总和,并生成加权邻接矩阵。

感谢您的帮助和建议

马里奥。

【问题讨论】:

    标签: igraph


    【解决方案1】:

    你所拥有的是一个二分图,你需要它的单分投影。这很简单:

    ## Sample data
    data <- "  ID    Name
      1      A
      2      B
      1      C
      1      B
      2      C
      2      D
      3      A
      3      B
    "
    
    ## Read it in an edge list
    el <- read.table(textConnection(data), header = TRUE)
    
    ## Create the bipartite graph from it
    G <- graph.data.frame(el, directed = FALSE)
    V(G)$type <- grepl("[0-9]+", V(G)$name)
    G
    #> IGRAPH UN-B 7 8 -- 
    #> + attr: name (v/c), type (v/l)
    #> + edges (vertex names):
    #> [1] 1--A 2--B 1--C 1--B 2--C 2--D 3--A 3--B
    
    
    ## Project it to authors (and papers)
    G_one <- bipartite.projection(G)
    
    ## You only need the authors
    GA <- G_one[[1]]
    
    ## Create an adjacency matrix form it
    GA[]
    #> 4 x 4 sparse Matrix of class "dgCMatrix"
    #>   A B C D
    #> A . 2 1 .
    #> B 2 . 2 1
    #> C 1 2 . 1
    #> D . 1 1 .
    

    【讨论】:

    • 亲爱的@Gabor Csardi,我有另一种生成邻接矩阵的方法,类似于您所呈现的。我正在使用以下命令:d
    • 此外,我使用了“m
    猜你喜欢
    • 2018-07-03
    • 2014-09-04
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    相关资源
    最近更新 更多