网络:使用igraph从事件节点数据制作图形对象

时间:2014-12-18 23:11:43

标签: r networking igraph

我想从事件记录数据中为igraph创建一个网络对象。

例如,我的数据看起来像这样。

 Event  Person
  1     Obama
  1     Putin
  1     Abe
  1     Cameron 
  2     Putin
  2     Xi
  2     Merkel
  3     Obama
  3     Abe
  3     Xi
  3     Merkel

我假设同一事件中的每个人都有联系。奥巴马,普京,安倍和卡梅伦都有联系,因为他们都参加了比赛。基于这些数据,奥巴马和安倍有两次联系,因为他们都参加了第一场和第三场比赛。

有了这些数据,我想计算度数/中介/亲密度中心性。要计算这些中心点,我需要有一个图形对象。如何创建图形对象或邻接矩阵来计算三个中心度量?

我很抱歉这个基本问题,但我不熟悉使用R进行网络分析。

提前谢谢!

2 个答案:

答案 0 :(得分:6)

这是一个二分图,你想要的是它的预测。

txt <- "Event  Person
          1     Obama
          1     Putin
          1     Abe
          1     Cameron 
          2     Putin
          2     Xi
          2     Merkel
          3     Obama
          3     Abe
          3     Xi
          3     Merkel
"

data <- read.table(textConnection(txt), header = TRUE)
BG <- graph.data.frame(data, directed = FALSE)
V(BG)$type <- grepl("^[0-9]+$", V(BG)$name)

bipartite.projection(BG)[[1]]
#> IGRAPH UNW- 6 13 -- 
#> + attr: name (v/c), weight (e/n)
#> + edges (vertex names):
#>  [1] Obama--Putin   Obama--Abe     Obama--Cameron Obama--Xi      Obama--Merkel 
#>  [6] Putin--Abe     Putin--Cameron Putin--Xi      Putin--Merkel  Abe  --Cameron
#> [11] Abe  --Xi      Abe  --Merkel  Xi   --Merkel 

答案 1 :(得分:3)

假设您将数据读入名为dd的data.frame,您可以使用

获取相邻的矩阵
X <- with(dd, table(Event, Person))
adj <- crossprod(X,X)

#          Person
# Person    Abe Cameron Merkel Obama Putin Xi
#   Abe       2       1      1     2     1  1
#   Cameron   1       1      0     1     1  0
#   Merkel    1       0      2     1     1  2
#   Obama     2       1      1     2     1  1
#   Putin     1       1      1     1     2  1
#   Xi        1       0      2     1     1  2

关于如何将其转换为图表对象,您有几个选项,但您最有可能使用graph.adjacency。这是一种方式

gg<-graph.adjacency(adj, mode="upper", weighted=TRUE, diag=FALSE);
plot(gg,  edge.width=E(gg)$weight)

enter image description here