邻接矩阵 - 基于任意变量的边

时间:2014-01-09 21:14:27

标签: r matrix social-networking

我正在尝试从一个简单的三变量数据集生成一个邻接矩阵(后来用于创建一个社交网络图)。见下文。

Year  Company  Project
2001    A       Proj1
2001    B       Proj1
2005    C       Proj3
2004    D       Proj4
2004    E       Proj4

这个想法是生成一个矩阵,其中行和列是公司,边缘表示任何给定的公司对是否参与了同一个项目。这看起来像是:

  A B C D E
A 0 1 0 0 0 
B 1 0 0 0 0
C 0 0 0 0 0
D 0 0 0 0 1
E 0 0 0 1 0

我如何在R中完成这样的事情?基于其他用户的尝试,我尝试了reshape2,但没有运气。 任何帮助,将不胜感激。 谢谢!

1 个答案:

答案 0 :(得分:2)

有更好的方法,但这是我所知道的。你需要qdap的开发版本。按照THIS PAGE底部的说明获取。

## dat <- read.table(text="Year  Company  Project
## 2001    A       Proj1
## 2001    B       Proj1
## 2005    C       Proj3
## 2004    D       Proj4
## 2004    E       Proj4", header=TRUE)

library(qdap)
x <- adjmat(mtabulate(split(dat$Company, dat$Project)))
x$adjacency

## > x$adjacency
##   A B C D E
## A 1 1 0 0 0
## B 1 1 0 0 0
## C 0 0 1 0 0
## D 0 0 0 1 1
## E 0 0 0 1 1

不可否认,为这个问题安装很多。它也可以使用reshape2包完成,并且有人也一定会提供该解决方案。

修改

不需要重塑这里更好的方式......

x <- table(dat[, -1])
x %*% t(x)

##        Company
## Company A B C D E
##       A 1 1 0 0 0
##       B 1 1 0 0 0
##       C 0 0 1 0 0
##       D 0 0 0 1 1
##       E 0 0 0 1 1

如果你真的想要对角线上的零:

y <- x %*% t(x)
diag(y) <- 0
y