我有一个无方向的论文网络,它们相互引用。我想找到具有“出度”(即引用了一篇论文)但没有“入度”(任何人都未引用)的论文/节点/顶点。
这似乎是一个非常简单的问题,但我无法在堆栈溢出/互联网的任何地方找到答案。
谢谢您的帮助!
编辑:举个例子,具有单个入度而没有出度的边列表如下所示:
Paper1 -> Paper3
Paper2 -> Paper3
Paper4 -> Paper1
Paper1 -> Paper4
Paper5 -> Paper1
Paper6 -> Paper4
在此示例中,我只想知道Paper5和Paper6的身份,它们引用了一篇论文,但未引用。它不需要在边缘列表中(尽管也可以)。因此,期望的输出是:
identified_papers <- c("Paper5", "Paper6")
答案 0 :(得分:1)
一旦您以适当的格式(例如,边缘列表:
from <- c("Paper1", "Paper2", "Paper4", "Paper1", "Paper5", "Paper6")
to <- c("Paper3", "Paper3", "Paper1", "Paper4", "Paper1", "Paper4")
edgelist <- cbind(from, to)
> edgelist
from to
[1,] "Paper1" "Paper3"
[2,] "Paper2" "Paper3"
[3,] "Paper4" "Paper1"
[4,] "Paper1" "Paper4"
[5,] "Paper5" "Paper1"
[6,] "Paper6" "Paper4"
使用igraph
可以从edgelist
生成图形
library(igraph)
g <- graph_from_edgelist(edgelist)
使用degree
函数以获取学位,并通过设置mode
参数来指定是否计算学位或学位:
> degree(g, mode = "in")
Paper1 Paper3 Paper2 Paper4 Paper5 Paper6
2 2 0 2 0 0
> degree(g, mode = "out")
Paper1 Paper3 Paper2 Paper4 Paper5 Paper6
2 0 1 1 1 1
从那里可以组合which
内的查询条件以满足要求,并使用names
提取相应的论文:
hits <- which(degree(g, mode = "in") == 0 & degree(g, mode = "out") == 1)
identified_papers <- names(hits)
> identified_papers
[1] "Paper2" "Paper5" "Paper6"
我希望这会有所帮助。