每个连接网络的度,紧密度,中间度

时间:2019-02-19 01:24:51

标签: r igraph

我有一个igraph,其中有几个断开的组件。例如:

library(igraph)
g <- simplify(
  graph.compose(
    graph.ring(10), 
    graph.star(5, mode = "undirected")
  )
) + edge("7", "8")

enter image description here

我想为这三个连接的网络分别计算紧密度,中间度和度数。到目前为止,我已经设法分离了网络,但不知道如何进一步进行。 这是我写的代码:

x <- clusters(g)
dg <- decompose.graph(g) # returns a list of three graphs
plot(dg[[156]], vertex.label=NA)

x1 <- data.frame(x$membership)
x1 <- cbind(Row.Names = rownames(x1), x1)
x1<- data.frame(x1)
rownames(x1) <- NULL
names(x1) <- c("email","membership")

x2 <- data.frame(x$csize)
x2 <- cbind(Row.Names = rownames(x2), x2)
x2 <- data.frame(x2)
rownames(x2) <- NULL
names(x2) <- c("membership","number_of_connections")
x2$membership <- as.numeric(x2$membership)

network <- merge(x1, x2, by = "membership")

这是我的输出:

enter image description here

我正在尝试计算每封电子邮件的3个不同的列:程度,亲密性,中间性。

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以计算所有这些内容。

B = rep(0, vcount(g))
for(i in 1:3) { B[x$membership==i] = betweenness(dg[[i]]) }
C = rep(0, vcount(g))
for(i in 1:3) { C[x$membership==i] = closeness(dg[[i]]) }

Nodes = data.frame(membership = x$membership, 
        email = 1:10,
        connections = x$csize[x$membership],
        degree = degree(g),
        closeness = C,
        betweenness = B)
Nodes
   membership email connections degree  closeness betweenness
1           1     1           7      5 0.14285714         6.0
2           1     2           7      5 0.14285714         1.5
3           1     3           7      3 0.11111111         0.5
4           1     4           7      3 0.11111111         0.5
5           1     5           7      3 0.11111111         0.5
6           1     6           7      1 0.08333333         0.0
7           2     7           2      1 1.00000000         0.0
8           2     8           2      1 1.00000000         0.0
9           3     9           1      0        NaN         0.0
10          1    10           7      4 0.11111111         1.0

答案 1 :(得分:1)

如果dg是您的网络列表,则可以使用lapply计算每个网络的中间性。

dg_bet<-lapply(dg,betweenness)

然后从purrr包中获取map_df,以将列表转换为数据框。

dg_bet <- map_df(dg_bet, ~as.data.frame(.x), .id="id")

哪个给你

       id  .x
   1   1 6.0
   2   1 1.5
   3   1 0.5
   4   1 0.5
   5   1 0.5
   6   1 0.0
   7   1 1.0
   8   2 0.0
   9   2 0.0
   10  3 0.0

您可以将这种方法应用于计算紧密度和度数,然后使用cbind将它们结合到您的主数据帧中。