假设我在R中有一个数据集,指示组内的个人。这是一个例子:

grp <- c(1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5)
ind <- c("A", "C", "D", "B", "C", "D", "E", "A", "D", "E", "B", "F", "E", "A", "F")
data.frame(grp, ind)

因此,数据如下所示:
   grp ind
1    1   A
2    1   C
3    1   D
4    2   B
5    2   C
6    2   D
7    2   E
8    3   A
9    3   D
10   3   E
11   4   B
12   4   F
13   4   E
14   5   A
15   5   F

因此,组1由个人(A,C,D)组成,组2由个人(B,C,D,E)组成,依此类推。我想创建一个网络图,以显示个人如何相互联系。在一个组中,所有个体都通过边连接。边缘的厚度应反映两个人相互连接的频率。

带有:
pairs <- do.call(rbind, sapply(split(ind, grp), function(x) t(combn(x,2))))

我可以获得一个具有所有成对边的矩阵,可以使用igraph包进行绘制:
library(igraph)
plot(graph.edgelist(pairs, directed=FALSE), edge.curved=FALSE)

但是,是否有一种方法可以使边缘的厚度与特定配对的发生频率成正比?

最佳答案

@hrbrmstr的解决方案构建第二个图以获取边缘权重。您还可以通过对pairs进行操作来预先执行此操作:

# Count unique edge pairs
library(plyr)
weighted <- ddply(data.frame(pairs), .(X1, X2), count)

# Plot
library(igraph)
g <- graph.edgelist(as.matrix(weighted[,1:2]), directed=FALSE)
plot(g, edge.curved=FALSE, edge.width=weighted$freq*3)

关于r - 根据组成员资格数据创建加权图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22695409/

10-11 15:25