我很乐意请求你的帮助。我有一个类似于下面的数据结构:
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>
感谢您的帮助和建议
马里奥。
答案 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 .