我有一个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个不同的列:程度,亲密性,中间性。
答案 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将它们结合到您的主数据帧中。