加权邻接矩阵igraph和R.

时间:2014-12-11 16:43:50

标签: igraph

我很乐意请求你的帮助。我有一个类似于下面的数据结构:

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

“ID”列是纸张的唯一标识符,“名称”列表示在纸张中具有协作的作者的姓名。我需要生成一个无向,加权的邻接矩阵。矩阵中的节点(或顶点)将是“名称”列中的作者对(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.算法的关键是在“名称”列中为每对作者计算此总和,并生成称重的邻接矩阵。 / p>

感谢您的帮助和建议

马里奥。

1 个答案:

答案 0 :(得分:0)

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

## 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 .
相关问题