繁体   English   中英

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

[英]degree, closeness, betweenness for each connected network

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

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

在此处输入图片说明

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

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")

这是我的输出:

在此处输入图片说明

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

在此处输入图片说明

您可以计算所有这些东西。

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

如果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将它们连接到您的主数据帧。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM