如何从计数矩阵中获得邻接矩阵

时间:2017-12-11 19:36:19

标签: r sparse-matrix adjacency-matrix

我有一个nxp非常稀疏的计数矩阵,只有非负值和名为y_1,...,y_p的列。 (n = 200万,p = 70)

我想使用R将其转换为矩阵,该矩阵计算y_i和y_j在同一行上具有非零值的次数。

示例:

ID a b c d e 
1  1 0 1 0 0
2  0 1 1 0 0
3  0 0 1 1 0
4  1 1 0 0 0

我希望获得:

- a b c d e
a 2 1 1 0 0
b 1 2 1 0 0 
c 1 1 3 1 0
d 0 0 1 1 0
e 0 0 0 0 0

1 个答案:

答案 0 :(得分:1)

这是一个简单的矩阵乘法。

t(m) %*% m
  a b c d e
a 2 1 1 0 0
b 1 2 1 0 0
c 1 1 3 1 0
d 0 0 1 1 0
e 0 0 0 0 0

使用此数据:

m = read.table(text = "ID a b c d e 
1  1 0 1 0 0
2  0 1 1 0 0
3  0 0 1 1 0
4  1 1 0 0 0", header = T)
m = as.matrix(m[, -1])

这取决于原始矩阵仅为1和0。如果不是,您可以使用m = original_matrix > 0

创建它

这里的工作就像你描述的矩阵一样:

library(Matrix)
nr = 2e6
nc = 70
mm = Matrix(0, nrow = nr, ncol = nc, sparse = T)

# make, on average, three 1s per row
set.seed(47)
mm[cbind(sample(nr, size = 3 * nr, replace = T), sample(nc, size = 3 * nr, replace = T))] = 1 

system.time({res = t(mm) %*% mm})
  #  user  system elapsed 
  # 0.836   0.057   0.895 
format(object.size(res), units = "Mb")
[1] "0.1 Mb

在我的笔记本电脑上,计算时间不到一秒,结果大约为0.1 Mb。