我有一个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
答案 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。